Målingen, ping, pubsub, pubsubhub, pubsubhubbub
I tilfelle du er skeptisk, det er en metode i galskapen over, i tittelen på innlegget. I tech sirkler er det usannsynlig at du ikke har hørt om pubsubhubbub. I raske månedene har det vært en av de tre snakket om ting. Andre to er homomorphic kryptering og Google bølgen [ 1. ]. Kommer tilbake til nåværende stilling - termer i tittelen indikerer hvordan du får innholdet fra andre mennesker. Etter detaljene blir mer tydelig, hvis du forestille ting skjer med hensyn til blogger, selv om de er konseptuelt ikke begrenset til blogger.
Polling refererer til situasjonen der kunder fortsette å spørre serveren hvis noe nytt har kommet opp. Hvor ofte å spørre etter oppdateringer vil alltid være et problem med polling for hyppig eller for sjelden, men som en leser påpekte her at en flott, ting med polling er at serveren ikke trenger å vedlikeholde tilstanden.
Ping refererer til tilfelle der når poste en artikkel, du (eller programvare) oppdaterer også noen populære (sentralt) oppdateringstjenester. Noe bakgrunn her .
Neste er pubsub som står for publisere / abonnere, en av de tidligste banen for det ble gjort her av Evan Henshaw-Plath og Kellan Elliott-McCrea (72 slides, men verdt å gå igjennom). Overbevisende eksempel de ga mot var dette - på en bestemt dato, FriendFeed krøp Flickr 2,9 millioner ganger for å få de nyeste bildene av 45,754 brukere, hvorav 6721 hadde besøkt Flickr i de 24 timer og kunne ha "potensielt" lastet opp et bilde. Merk at det de foreslo var ikke en ny teknologi, som de påpeker 'revolusjonerende ny 20 år gammel teknologi ". Hvis du gjør det for blogger da en av de store problemene med XMPP - tilstedeværelse data overhead, som kan være så høy som 60-70% kan reduseres mye.
pubsubhub står for publisere Abonner hub og pubsubhubbub er en protokoll, kjerne av noe som er ideen om pubsubhub. Hvori utgivere (si bloggere) oppdatere hub som (kan være mer enn én huber, som snakker med hverandre) ligger «et sted i sky", som per protokoll dette kan skyve eller trekke i henhold til protokollen, men det neste ledd i kjeden, hub til klient (si leserne) er det skyve alltid modell. Denne siden er godt utgangspunkt for pubsubhubbub, oversikt lysbilder er gode. Helt veltalende Anil Dash beskriver det her som trykknapp web.
To andre relaterte lesninger er webhooks som er utgangspunktet http tilbakeanrop. Github bruker det, så gjør paypal for asynkrone meldinger om betaling i IPN . Så gjør mange andre. Relaterte Konseptet er rsscloud som er igjen pubsub hub. Følg denne linken for detaljer.
Du lurer kanskje på hva som er poenget med å skrive alle disse her, er det to ett. Disse tingene er verdt å vite, minimalt minst og to. Denne bloggen er pubsubhubbub aktiveres nå via appspot hub med dette wordpress plugin og fôr også er pubsubhubbub aktivert via FeedBurner, link her
-
[ 1 ]. - God innledende lese for fullt homomorphic kryptering er denne artikkelen av Bruce Schneier og denne diskusjon er mer eller mindre eneste kilden for Google Wave.
-OPPDATERING - Dette innlegget forklarer hvordan kravet om offentlig server for tilbakering kan bli jobbet rundt for stasjonære klienter ved hjelp av XMPP gateway (for pubsubhubbub).
Litt av forsamlingen
Etter å ha lest denne artikkelen om lock gratis buffere og se bruken av CAS (sammenligne og bytte), følte jeg meg som legger forsamlingen koden for å gjøre det samme. Bruk tilfelle der borte var å skrive en innfødt metode og kalle det fra Java (tilbake i 1.5, da samtidige datastrukturer i Java var mer eller mindre ikke eksisterende). Uten videre, vil jeg utnytte koden til deg
. Først er for CAS og andre er for databehandling GCD bruke Euklids algoritme (denne kan finnes i mange steder og opplæring i tillegg).
Kompilere og kjøre instruksjoner gcc file_name.c ; ./a.out
Sammenlign og Bytt
# Include# Include / / Bytte - newvalue, er comperand gammel / forventet verdi / * * Funksjon gjør faktisk det følgende ting - hvis verdien på * dest er lik oldvalue deretter erstatte det med newvalue ellers la den uendret: å gjøre alle disse atomically * * Det er to alternativer for returverdi * 1.is initial verdi på * dest og la byrden av å kalle fxn å sammenligne den med oldval * 2. gjør det over her og returnere 0 eller 1, bør dette være mer effektiv ** / / * Senere endre den til makro * / int CAS (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 resultat = 1 ;/ * 1 viser at CAS lyktes og 0 viser at det sviktet * / / * Btw må sette cc for flagg clobbering! * / __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" / * skal LOCK være på samme linje * / "JZ FERDIG \ n \ t" "Movl $ 0,% 1 \ n \ t" "FERDIG: \ n \ t" : "= M" (dest), "= g" (resultat) : "G" (oldvalue), "g" (newvalue), "M" (dest) : "% Eax", "% EBX", "ECx", "CC" ); printf ("(% d,% d,% d)", * dest, oldvalue, newvalue); returnere resultatet; } / * TODO * Skrive et annet asm fxn som setter ovenfor fxn på en stund løkke og fortsette å prøve med mindre det lykkes * / 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 ("endring verdi * c til% 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)); returnere 0; }
Formatering notater - virker som wp-syntaks highlighter er å legge til slutt, ignorere det.
GCD
# Includeint gcd (int a, int b) { int resultat; / * Beregn største felles divisor bruke Euklids algoritme * / __asm__ __ volatile__ ("movl% 1,%% EAX;" "Movl% 2,%% EBX;" "Forts: cmpl $ 0,%% EBX;" "Je gjort;" «Xorl%% EDX,%% EDX;" «Idivl%% EBX;" «Movl%% EBX,%% EAX;" «Movl%% EDX,%% EBX;" "JMP forts;" "FERDIG: movl%% eax,% 0;": "= g" (resultat): "g" (a), "g" (b) ); returnere resultatet; } int main () { int første, andre; printf ("Skriv to heltall:"); scanf ("% d% d", & første, og andre); printf ("GCD av% d &% d er% d \ n", første, andre, gcd (første, andre)); returnere 0; }
Cricketing verden venter en New World Order
Etter en serie som spenner over fem tester og ca to måneder, England gjenvunnet aske.
La oss snakke om det vinnende laget første - sitt midten rekkefølgen er "gjennomsnittlig" hvis du ikke ønsker å kritisk. Greame Swann bidrag med balltre teller ikke mindre enn bidraget med ballen. Stuart Broad - best allrounder var ikke starter for den femte prøven. Andrew Strauss var den eneste konsekvente batsman og Jimmy Anderson var den eneste konsekvente bowler.
Poenget her er ikke å skjelle resultatene av det vinnende laget, men å sette i perspektiv det faktum at til tross for alle disse, Australia tapt. du må tenke noen sekunder, hvis bedt om å navngi sitt beste bowler. Høyre, var det BW Hilfenhaus. Hauritz overgikk Everbody forventning, men var likevel ikke god nok til å bli valgt for to av de fem testene. Sør-Afrika ble aldri en verden beater uten en verdensklasse spinner, kan Australia ikke håpe på å forbli en uten en god nok minst ett. Magiker forlot scenen og det ser ikke ut som kunst lenger, glem magi. Ponting står høyt blant mindre dødelige og Michael Clarke står opp veldig ofte, men det gjør dem et lag med noen veldig gode spillere og ikke et veldig godt lag.
Ashes 2009 vil bli husket for Andrew Flintoff siste Aske, Stuart Bred ankomst som en all rounder (hvis han legger litt mer Ashes folklore til sin lovende start), og en av de mest talende debut-tallet av all tid ved Trott men det vil også være husket som det punktet der IFS og buts om Australias overhøyhet ble endelig satt til hvile, er det over. Ikke misforstå de fortsatt kan grave Mike Hussey eller Stuart Clark, men du føler at bidraget all time storheter når de går glipp av. Noen ganger kommer de til å minne deg selv i IPL, men fortsatt er de ikke kan erstattes. La oss føler meg velsignet for å ha sett Warne, McGrath og Gilchrist spille sammen og blir støttet av Waughs, Ponting, Hyden, Martin og Langer.
Fremover vil Sør-Afrika alltid forbli et veldig godt lag, men de trenger for å vinne semifinalen, og være mer konsekvent i hele verden, vil Pakistan forblir gåtefullt strålende, vil indiske Young Guns trolig finne det tøft å fylle skoene til ekstraordinære forgjengere. Sri Lanka skal fortsette å vise glimt av kunst i håndverket. Men, kanskje vi må vente på en gang før å ha en alt ut dominerende lag eller før en kaptein klager over mangel på konkurranse, som Steve Waugh gjorde en gang.
På et beslektet notat - la oss velkommen den kommende baksiden av Asif, har han en helvetes masse potensiale, la oss håper å se noen av det og også velkommen Andy Flower i den nye awatar, rett du ikke kan holde gode menn nede for lenge.
Ruby en liners å lage hasj
I går mens du går gjennom en av mine gamle programmer, fant jeg dette skrevet av meg en gang tilbake:
#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
Å drepe noen av spenning la meg avsløre at raw_text ser ut
, Rett den har blitt kuttet fra paypal betaling bekreftelse.
Over linjen hvis brutt i deler lyder bedre:
unescaped_array = CGI.unescape (raw_text). split ('&') unescaped_array = unescaped_array.collect {| x | b = x.split ("="); b.push (null) hvis b.size == 1; b} flattened_array = unescaped_array.flatten hash = Hash [* flattened_array]
La oss gjøre individuelle trinn i IRB:
IRB (hoved):. 009:0> unescaped_array = CGI.unescape (raw_text) split ('&') => ["Suksess", "mc_gross = 10,00", "protection_eligibility = ikke kvalifisert", "payer_id = U7PPJJ4TSJ47E", "skatt = 0.00", "payment_date = 09:45:30 10 juli 2009 PDT", "payment_status = Venter "] IRB (hoved): 013:0> unescaped_array = unescaped_array.map {| x | b = x.split ("="); b.push (null) hvis b.size == 1; b} => [["Suksess", null], ["mc_gross", "10.00"], ["protection_eligibility", "ikke kvalifisert"], ["payer_id", "U7PPJJ4TSJ47E"], ["skatt", "0.00"] , ["payment_date", "09:45:30 den 10 juli 2009 PDT"], ["payment_status", "Venter"]] IRB (hoved): 014:0> flattened_array = unescaped_array.flatten => ["Suksess", null, "mc_gross", "10.00", "protection_eligibility", "ikke kvalifisert", "payer_id", "U7PPJJ4TSJ47E", "skatt", "0.00", "payment_date", "09:45: 30 10 juli 2009 PDT "," payment_status "," Venter "] IRB (hoved): 015:0> hash = Hash [* flattened_array] => {"Skatt" => "0.00", "payment_status" => "Pending", "payer_id" => "U7PPJJ4TSJ47E", "mc_gross" => "10.00", "suksess" => nil, "payment_date" = > "09:45:30 den 10 juli 2009 PDT", "protection_eligibility" => "kvalifisert"}
BTW, er * kalles feilindikator operatør i rubin
En annen måte å lage hasj fra 'utvalg av parene "er å bruke injisere:
hash = [[1,2], [3,4]] injisere ({}). {| Resultatet, element | Resultatet [element.first] = resultat [element.last]; resultat} Det er enda en måte
Skriv en loop, som jeg vil forlate som en øvelse til leserne!
Her er litt urelatert brukstilfellet med å lage hasj fra arrays:
IRB (hoved): 005:0> [1,2,3,4,7,9] group_by {| x | x <5.? : Mindre :: større} => {: Lesser => [1, 2, 3, 4],: større => [7, 9]}
Du kan gjøre flere ting, i utgangspunktet resultat av blokken brukes som nøkkel for at element i den resulterende hash.
gmail, Mutt og msmtp fix
Hvis du bruker mutt og smtp tilgang til Gmail. Her er en (dårlig) nyheter. Kule gutter på Google igjen endret sertifikat. Å, fikk du spørre - hvordan vet det det? Enkelt Mutt begynte klager om dårlig attest når du prøver å bruke msmpt, beryktede «msmtp: TLS sertifikat mislyktes:. Sertifikatet har ikke fått en kjent utsteders hilste på meg på skjermen.
For å krysse bekrefte -
Bare kjør etter
$ msmtp --serverinfo --host=smtp.gmail.com --tls=on --port=587 --tls-certcheck=off
I stedet for gamle Thwate Server Nå får du følge i utsteder segment
Issuer:
Common Name: Google Internet Authority
Organization: Google Inc
Country: US
Heldigvis fix er enkel, her er hva du trenger å gjøre på debian
# apt-get install ca-certificates
# dpkg -s ca-certificates|grep Version
Version: 20090814
Etter dette bare endre følgende linje i deg ~ / må. 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
til
tls_trust_file /usr/share/ca-certificates/mozilla/Equifax_Secure_CA.crt
Git og Awesome Survey
Her er to linker for undersøkelse av GIT (versjonskontrollsystem) og kjempeflott (vindusbehandler) samfunnet. Hvis du bruker en av disse, kan du ta ut litt tid å fylle ut spørreskjemaet. Tenk på det som den enkleste måten å bidra tilbake til programvaren du bruker.
Her er linkene:
Git - http://www.survs.com/survey?id=2PIMZGU0&channel=Q0EKJ3NF54
Awesome - http://www.survs.com/survey?id=8BVEV3FO&channel=BH07CQ040D
Note - (Som finnes på disse sidene, men på bunnen
) -
"Hvis du har aktivert informasjonskapsler, kan du alltids sende delvis fylt undersøkelsen, og gå tilbake til dine svar på senere tidspunkt, fullføre det senere."
Flette hashes i YAML KonFerAnSeGUIde filer
YAML er ganske hendig for å skrive konfigurasjonsfiler. Primær fordel er at, leser det som tekstfil. Dette fungerer veldig bra hvis config-filen er flat (noe hierarki) og har ingen repetisjoner.
Hvis konfigurasjoner filen har repetisjoner så det er fornuftig å skille ut disse elementene og bruke dem. Hva jeg mener er dette - la oss si at du config-filen ser slik ut:
utvikling: input_location: common_input output_location: dev_location mail: smtp_server: din_server login: your_login Passord: top_secret produksjon: input_location: common_input output_location: dev_location mail: smtp_server: din_server login: your_login Passord: top_secret
Forutsatt ovenfor koden i / tmp / test.yml her er hvordan du kan lese i python og ruby
$cat readyml.py
#! / Usr / bin / env python fra pprint import pprint som pp # I debian må installere python-YAML fra YAML import belastning, load_all, dump hash = last (open ('/ tmp / test.yml')) pp (hash ['utvikling'])
$ cat readyml.rb
#! / Usr / bin / env rubin kreve 'pp' hash = YAML :: belastning (File.open ('/ tmp / test.yml'). lest) pp hash ['utvikling']
Her er en hendig en liner for ruby versjon
$ ruby -rpp -e 'pp YAML::load(File.open("/tmp/a.yml"))["development"]' eller du kan prøve det samme i IRB eller Python-konsollen.
Merk at i ovennevnte kodebiten, er alt annet enn utskuff er samme i utvikling og produksjon del. Det er der yml node identifikator kommer til unnsetning. Ideen er enkel ha et sett med standardverdier og overstyre dem på forskjellig sted.
Du kan trekke den fra hverandre som følger:
standardverdier og mislighold input_location: common_input output_location: dev_location mail: SENDER_NAME: avsender smtp_server: din_server login: your_login Passord: top_secret utvikling: <<: * Mislighold produksjon: <<: * Mislighold output_location: prod_location
$ ruby -rpp -e 'pp YAML::load(File.open("/tmp/a.yml"))["development"]["mail"]["login"]'
"your_login"
$
Flott, det fungerer (tm)!.
Man kan hevde vi handlet litt klarhet for litt magi. Her er en liten forklaring: &, * og <<: & som er ankerkode kan forstås som node identifikator, er * node referanse og <<: står for hasj flettingen.
For flere detaljer se enten YAML specs eller wikipedia
Så langt så bra, men det er en hake her, disse hash fusjonerer er ikke rekursiv. Hva det betyr er dette: La oss si at du vil ha ulik avsender for e-post i to miljøer, kan du bli fristet til å gjøre følgende:
standardverdier og mislighold input_location: common_input output_location: dev_location mail: SENDER_NAME: avsender smtp_server: din_server login: your_login Passord: top_secret utvikling: <<: * Mislighold mail: SENDER_NAME: sender_dev produksjon: <<: * Mislighold output_location: prod_location mail: SENDER_NAME: sender_prod
Lar sjekk
$ ruby -rpp -e 'pp YAML::load(File.open("/tmp/a.yml"))["development"]["mail"]["login"]'
nil
$
Oops, noe gikk galt, problemer som nevnt ovenfor er at hasj flettingen er ikke rekursiv og samtidig flette den erstattet post mislighold post av produksjon som har kun én tast. Løsning / arbeid rundt er å rulle en mer nivå:
common_settings: & common_settings input_location: common_input output_location: dev_location mail_defaults: & mail_defaults SENDER_NAME: avsender smtp_server: din_server login: your_login Passord: top_secret standardverdier og mislighold <<: * Common_settings mail: <<: * Mail_defaults utvikling: <<: * Mislighold produksjon: <<: * Mislighold mail: <<: * Mail_defaults SENDER_NAME: sender_prod
Lar sjekk igjen
$ ruby -rpp -e 'pp YAML::load(File.open("/tmp/a.yml"))["development"]["mail"]["login"]'
"your_login"
$
Sa du at du har en mer nivå av hekkende, godt du kan definitivt rulle en mer nivå, men så blir det et rot. Så hvis du ikke prøver å skrive løsningen på tårnene i Hanoi i en conf fil, er det bedre å restucture conf fil enn å grave i YAML eller noe annet. Men det er samtalen uansett.
Flotte programmerere finne enkle løsninger på komplekse problemer
Etter en lang tid, kan jeg finne kilden for følgende sitat-
Junior programmerere lage enkle løsninger på enkle problemer. Senior programmerere lage komplekse løsninger på komplekse problemer. Flotte programmerere finne enkle løsninger på komplekse problemer.
Det er fra et essay kalt Vakker Software av Charles Connell.
En annen favoritt av meg er Zen av Python -
Vakker er bedre enn stygg.
Eksplisitt er bedre enn implisitt.
Enkelt er bedre enn komplisert.
Complex er bedre enn komplisert.
Flat er bedre enn nestes.
Sparsomme er bedre enn tett.
Lesbarhet teller.
Spesielle tilfeller er ikke spesiell nok til å bryte reglene.
Selv om praktiske slår renhet.
Feil skal aldri passere i stillhet.
Med mindre eksplisitt forstummet.
I møte med tvetydighet, nekte fristelsen til å gjette.
Det bør være en-og fortrinnsvis bare én opplagt måte å gjøre det.
Selv på den måten ikke kan være tydelig på første med mindre du er nederlandsk.
Nå er bedre enn aldri.
Selv er aldri ofte bedre enn * akkurat * nå.
Dersom implementeringen er vanskelig å forklare, er det en dårlig idé.
Dersom implementeringen er enkel å forklare, kan det være en god idé.
Navnerom er en honking god idé - la oss gjøre mer av dem!
-------------------------
og så er det klassisk Tao of Programming
-
kreditter som på linket hjemmeside-
Oversatt av Geoffrey James
Transkribert av Duke Hillard
Overføres ved Anupam Trivedi, Sajitha Tampi, og Meghshyam Jagannath
Re-html-anskaffe og redigert av kragen Sittler
-
Book 1 - The Silent Void
Dermed talte mesteren programmerer:
"Når du har lært å snappe feilkoden fra fellen rammen, det
vil være tid for deg å gå. "1.1
Noe mystisk er dannet, født i den stille ugyldig. Venter alene og
ubevegelig, er det samtidig stille og likevel i konstant bevegelse. Den er kilden
av alle programmer. Jeg vet ikke navnet, så jeg vil kalle det Tao av
Programmering.Hvis Tao er stor, så operativsystemet er stor. Hvis operativsystemet
Systemet er flott, da kompilatoren er stor. Dersom kompilatoren er stor,
da søknaden er stor. Brukeren er fornøyd og det eksisterer
harmoni i verden.The Tao of Programming flyter langt unna, og avkastning på vinden i morgen.
1.2
The Tao fødte maskin språk. Machine språk fødte
assembler.Assembler fødte kompilatoren. Nå er det titusen
språk.Hvert språk har sin hensikt, men ydmyk. Hvert språk uttrykker
Yin og Yang av programvare. Hvert språk har sin plass innenfor Tao.Men ikke programmere i Cobol hvis du kan unngå det.
1.3
I begynnelsen var Tao. The Tao fødte rom og tid.
Derfor Space og Time er Yin og Yang av programmering.Programmerere som ikke fatte Tao alltid kjører ut av tiden
og plass for sine programmer. Programmerere som fatte Tao alltid
har nok tid og plass til å oppnå sine mål.Hvordan kunne det være annerledes?
1.4
Den kloke programmerer er fortalt om Tao og følger den. Den gjennomsnittlige
programmereren fortalte om Tao og søker etter den. Den tåpelige programmerer
fortelles om Tao og ler på den.Hvis det ikke var for latter, ville det ikke være noen Tao.
De høyeste lydene er vanskeligst å høre.
Fremover er en måte å trekke seg tilbake.
Stort talent viser seg sent i livet.
Selv en perfekt program har fortsatt bugs.-------------------------
Bok 2 - De gamle mestere
Dermed talte mesteren programmerer:
"Etter tre dager uten programmering, blir livet meningsløst."
2.1
Programmerere av gammel var mystisk og dyp. Vi kan ikke begripe
sine tanker, så alt vi gjør er beskrive deres utseende.Aware, som en rev krysser vannet. Varsling, som en generell på
slagmarken. Kind, som en vertinne hilser sine gjester. Enkelt, som
uncarved blokker av tre. Opak, som svarte bassenger i mørke huler.Hvem kan fortelle hemmelighetene deres hjerter og sinn?
Svaret finnes bare i Tao.
2.2
Grand Master Turing gang drømt at han var en maskin. Da han våknet han
utbrøt:"Jeg vet ikke om jeg AM Turing drømmer at jeg er en maskin, eller en
maskin drømte at jeg AM Turing! "2.3
En programmerer fra en veldig stor datamaskin selskapet gikk til en programvare
konferanse og deretter tilbake til å rapportere til sin manager, og sa: «Hva slags
av programmerere jobber for andre selskaper? De oppførte seg dårlig og ble
ubekymret med opptredener. Deres hår var lang og uflidd og deres
klærne var rynkete og gammel. De krasjet vår gjestfrihet suite og de
gjorde uhøflige lyder under presentasjonen min. "Manageren sa: "Jeg skulle aldri ha sendt deg til konferansen. De
programmerere leve utover den fysiske verden. De anser liv absurd, en
utilsiktet tilfeldighet. De kommer og går uten å vite begrensninger.
Uten en omsorg, lever de kun for sine programmer. Hvorfor skulle de bry seg
med sosiale konvensjoner?"De lever innenfor Tao."
2.4
En nybegynner spurt Master: "Her er en programmerer som aldri utvikler,
dokumenter eller tester sine programmer. Men alt som kjenner ham vurdere ham til en av
de beste programmerere i verden. Hvorfor er dette? "The Master svarer: "Det programmerer har mestret Tao. Han har gått
utover behovet for design; han ikke blir sint når systemet
krasjer, aksepterer men universet uten bekymring. Han har gått utover
behov for dokumentasjon, han ikke lenger bryr seg om noen andre ser sin kode.
Han har gått utover behovet for testing; hvert av programmene hans er perfekt
i seg selv, rolig og elegant, deres formål selvinnlysende. Sannelig,
Han har inngått mysterium Tao. "-------------------------
Bok 3 - Design
Dermed talte mesteren programmerer:
"Når programmet blir testet, er det for sent å lage design
endringer. "3.1
Det var en gang en mann som gikk til en datamaskin messe. Hver dag som han
inn, fortalte mannen vakten i døren:"Jeg er en stor tyv, kjent for mine prestasjon av butikktyveri. Vær
forkant, skal for denne messen ikke unnslippe unplundered. "Denne talen forstyrret vakten sterkt, fordi det var millioner av
dollar av datautstyr inne, så han så mannen nøye. Men
mannen bare vandret fra bod til bod, nynnet stille for seg selv.Da mannen forlot, tok vakten ham til side og søkte klærne hans, men
ingenting var å finne.På den neste dagen av messen, returnerte mannen og skjente vakten
sa: «Jeg rømte med et stort bytte i går, men i dag vil bli enda
bedre. "Så vakten så ham stadig nærmere, men til ingen nytte.På den siste dagen av messen, kunne vakt holde sin nysgjerrighet
ikke lenger. "Sir Thief," sa han, «jeg er så forvirret, kan jeg ikke leve i
fred. Vennligst opplyse meg. Hva er det du stjeler? "Mannen smilte. "Jeg stjeler ideer," sa han.
3.2
Det var en gang en mester programmerer som skrev ustrukturerte programmer. A
nybegynner programmerer, som søker å etterligne ham, begynte også å skrive
ustrukturerte programmer. Når nybegynneren spurte mesteren å vurdere sin
fremgang, kritiserte master ham for å skrive ustrukturerte programmer,
sa: «Hva er passende for mesteren er ikke hensiktsmessig for
nybegynner. Du må forstå Tao før transcendere struktur. "3.3
Det var en gang en programmerer som var festet til en domstol i den krigsherren
av Wu. Den krigsherren spurt programmerer: "Hvilke er lettere å designe: en
regnskap pakke eller et operativsystem? ""Et operativsystem," svarte programmerer.
Den krigsherren ytret et utrop av vantro. "Sikkert en regnskapsmessig
Pakken er trivielt ved siden av kompleksiteten i et operativsystem, "han
sa."Ikke så," sa programmerer, "når du utformer en regnskapsmessig pakken,
programmereren opererer som en megler mellom mennesker med forskjellig
ideer: hvordan det skal fungere, hvordan dets rapporter skal vises, og hvordan det må
overensstemmelse med skattelovgivningen. Som kontrast er et operativsystem ikke begrenset
av eksterne opptredener. Ved utforming av et operativsystem, programmerer
søker det enkleste harmoni mellom maskin og ideer. Dette er grunnen til en
operativsystemet er lettere å designe. "Den krigsherren av Wu nikket og smilte. "Det er alt bra og godt, men
som er lettere å feilsøke? "Programmereren svarte ikke.
3.4
En leder gikk til master programmerer og viste ham de krav
dokument for en ny søknad. Lederen spurte mesteren: "Hvor lenge
vil det ta å designe dette systemet hvis jeg tildele fem programmerere til det? ""Det vil ta ett år," sa mesteren omgående.
"Men vi trenger dette systemet umiddelbart eller enda raskere! Hvor lenge vil det
ta hvis jeg tildele ti programmerere til det? "Mesteren programmerer rynket pannen. "I så fall vil det ta to år."
"Og hva om jeg tildele hundre programmerere til det?"
Mesteren programmerer trakk på skuldrene. "Da utformingen aldri vil bli
ferdig, "sa han.-------------------------
Book 4 - Koding
Dermed talte mesteren programmerer:
"En velskrevet programmet er sin egen himmel, en dårlig skrevet program er
sin egen helvete. "4.1
Et program skal være lett og smidig, dets subrutiner koblet som en
perlerad. Ånden og intensjonen i programmet bør beholdes
hele. Det skal være verken for lite eller for mye, verken
unødvendige sløyfer eller unyttige variabler, verken mangel på struktur og heller
overveldende stivhet.Et program bør følge `Law of Least forbauselse". Hva er dette lov?
Det er rett og slett at programmet skal alltid svare brukeren på veien
som forbauser ham minst.Et program, uansett hvor komplisert, bør fungere som en enkelt enhet. Programmet
bør styres av logikken innenfor snarere enn av ytre utseende.Hvis programmet svikter i disse kravene, vil det være i en tilstand av
uorden og forvirring. Den eneste måten å løse dette er å skrive om
program.4.2
En nybegynner spurte mesteren: "Jeg har et program som en gang kjører og
noen ganger avbryter. Jeg har fulgt reglene i programmering, men jeg er
helt forbløffet. Hva er grunnen til dette? "Mesteren svarte: "Du er forvirret fordi du ikke forstår Tao.
Bare en tosk forventer rasjonell atferd fra hans medmennesker. Hvorfor gjør dere
forventer det fra en maskin som mennesker har laget? Datamaskiner simulere
determinisme, bare Tao er perfekt."Reglene for programmering er forbigående, bare Tao er evig. Derfor
du må tenke Tao før du får opplysning. ""Men hvordan skal jeg vite når jeg har fått opplysning?" Spurt
nybegynner."Din Programmet vil da kjøre riktig," svarte mesteren.
4.3
En mester ble forklare natur Tao av til en av hans noviser. "The
Tao er nedfelt i all programvare - uansett hvor ubetydelig, "sa
mesteren.«Er Tao i en håndholdt kalkulator?" Spurt nybegynner.
"Det er," kom svaret.
«Er Tao i et videospill?" Fortsatte nybegynneren.
"Det er selv i et videospill," sa mesteren.
"Og er det Tao i DOS for en personlig datamaskin?"
Mesteren hostet og flyttet sin stilling noe. "Demonstrasjonen er over
for i dag, "sa han.4.4
Prince Wangs programmerer ble koding programvare. Fingrene danset på
tastatur. Programmet kompilert uten en feilmelding, og programmet
løp som en mild vind."Excellent" prinsen utbrøt: «Din teknikken er feilfri!"
"Technique?" Sa programmerer snu fra terminal hans, "Hva jeg
følge er Tao - hinsides alle teknikker! Da jeg først begynte å programmere jeg
ville se meg hele problemet i en masse. Etter tre år har jeg ingen
lenger så dette masse. Isteden brukte jeg subrutiner. Men nå ser jeg ingenting.
Hele min vesen eksisterer i en formløs ugyldig. Mine sanser er inaktiv. Min ånd,
fri til å arbeide uten plan, følger sin egen instinkt. Kort sagt, mitt program
skriver selv. Riktignok noen ganger er det vanskelige problemer. Jeg ser dem
kommer, sakte jeg ned, ser jeg stille. Så jeg endre en eneste linje med kode
og vanskelighetene borte som puffs av inaktiv røyk. Jeg så kompilere
program. Jeg sitte stille og la glede av arbeidet fyller mitt vesen. Jeg lukker min
øynene et øyeblikk og deretter logge av. "Prince Wang sa: "Vil at alle mine programmerere var like klok!"
-------------------------
Bok 5 - Vedlikehold
Dermed talte mesteren programmerer:
"Selv om et program være, men tre linjer lange, en dag vil det være
opprettholdt. "5.1
Et velbrukt dør trenger ingen olje på hengslene.
En rask flyt stream vokser ikke stillestående.
Verken lyd eller tanker kan reise gjennom et vakuum.
Programvare råtner hvis den ikke brukes.Disse er store mysterier.
5.2
En leder spurte en programmerer hvor lang tid det ville ta ham til å fullføre
program hvor han jobbet. "Det vil bli ferdig i morgen," den
programmerer straks svarte."Jeg tror du blir urealistisk," sa manageren, "Sannferdig, hvordan
lang tid vil det ta? "Programmereren tenkte et øyeblikk. "Jeg har noen funksjoner som jeg ønsker å
legge til. Dette vil ta minst to uker, "han endelig sa."Selv det er for mye å forvente," insisterte sjefen, "jeg vil være
fornøyd hvis du bare fortelle meg når programmet er ferdig. "Programmereren samtykket til dette.
Flere år senere, pensjonert leder. På vei til sin avgang
lunsj, oppdaget han programmerer sov ved terminal hans. Han hadde vært
programmering hele natten.5.3
En nybegynner programmerer gang ble tildelt kode en enkel økonomisk pakke.
Nybegynneren jobbet iherdig i mange dager, men når hans herre anmeldt
hans program, oppdaget han at den inneholdt en skjerm editor, et sett av
generalisert grafikk rutiner, en kunstig intelligens grensesnitt, men
ikke den minste omtale av noe økonomisk.Når herren spurte om dette, ble nybegynner indignert. "Ikke vær
så utålmodig, "sa han,« jeg skal putte i den økonomiske ting til slutt. "5.4
Har forsømme en god bonde en avling han har plantet?
Har overse en god lærer selv den mest ydmyke student?
Tillater en god far en enkelt barn å sulte?
Ikke nekte en god programmerer for å opprettholde sin kode?-------------------------
Book 6 - Ledelse
Dermed talte mesteren programmerer:
«La de programmerere være mange og lederne få - da vil alt være
produktiv. "6.1
Når ledere holder endeløse møter, programmerere skriver spillene. Når
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. When
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. It
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
said.“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. Do
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. Ingen
change in management can harm him. He will not be fired, even if the
project is cancelled. Why is this? 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. And
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.
so
$ 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"



































