undersökning, ping, pubsub, pubsubhub, pubsubhubbub
Om du är skeptisk, det finns en metod i galenskapen ovan, i titeln på inlägget. I tech kretsar är det osannolikt att du inte har hört talas om pubsubhubbub. I snabba månaderna har det varit en av de tre pratade om saker. De två andra är homomorphic kryptering och Google wave [ 1. ]. För att återgå till nuvarande post - termer i titeln anger hur du får innehållet från andra människor. Följande uppgifter blir mer tydligt, om du tänka dig saker händer när det gäller bloggar, trots att de begreppsmässigt inte är begränsade till bloggar.
Polling avser scenario där kunderna frågar servern om något nytt har kommit upp. Hur ofta frågar efter uppdateringar kommer alltid att vara ett problem med polling alltför ofta eller för sällan, men som en läsare påpekade här att en stor, sak med polling är att servern inte behöver hålla staten.
Ping hänvisar till fall där då skicka en artikel, du (eller din programvara) också uppdateras några populära (central) uppdatering tjänster. Lite bakgrundsinformation här .
Nästa är pubsub som står för publicera / prenumerera en av de tidigaste pitch för den gjordes här av Evan Henshaw-Plath och Kellan Elliott-McCrea (72 bilder, men värt att gå igenom). Övertygande exempel de gav mot var detta - på ett visst datum, FriendFeed kröp Flickr 2,9 miljoner gånger för att få de senaste bilderna från 45,754 användare, varav 6.721 hade besökt Flickr i dessa 24 timmar och skulle ha "potentiellt" laddat upp en bild. Observera att vad de föreslog var inte en ny teknik, eftersom de pekar ut "revolutionerande nytt 20 år gammal teknik". Om du gör det för bloggar sedan ett av de största problemen med XMPP - Förekomst uppgifter overhead, som kan vara så hög som 60-70% kan minskas en hel del.
pubsubhub står för publicerar Prenumerera nav och pubsubhubbub är ett protokoll, kärna utgörs av idén om pubsubhub. Där förlagen (säg bloggare) uppdatera navet som (kan vara mer än en nav, som talar med varandra) finns "någonstans i molnet", enligt protokollet detta kan skjuta eller dra enligt protokollet, men nästa länk i kedjan, navet klient (säg läsare) att det alltid är tryck-modellen. Denna sida är bra utgångspunkt för pubsubhubbub, översikt bilderna är bra. Ända vältaliga Anil Dash beskriver det här som tryckknapp webben.
Två andra relaterade läsningar är webhooks vilket i grunden http återbesök. Github använder det, så gör paypal för asynkrona meddelanden om betalning IPN . Så gör många andra. Relaterad Konceptet rsscloud vilket återigen är pubsub nav. Följ den här länken för mer information.
Du kanske undrar vad är det för mening att skriva alla dessa här, finns det två 1. Dessa saker är värt att veta, minimalt minst och 2. Denna blogg är pubsubhubbub aktiverat nu via appspot hub med denna wordpress plugin och foder är också pubsubhubbub aktiveras via FeedBurner, länk här
-
[ 1 ]. - Bra inledande läsa för fullt homomorphic kryptering är här artikel av Bruce Schneier, och det tal är mer eller mindre enda källan till Google Wave.
-UPDATE - Det här inlägget förklarar hur kravet på allmän server för återuppringning kan bearbetas runt för stationära klienter genom att använda XMPP gateway (pubsubhubbub).
Lite av enheten
Efter att ha läst den här artikeln om Lock gratis buffertar och ser användning av CAS (jämför och swap), kände jag mig som att publicera den assemblerkod att göra detsamma. Använd fall över det var att skriva en alternativ metod och kallar det från Java (tillbaka i 1,5, då samtidiga datastrukturer i Java var mer eller mindre obefintlig). Utan vidare, jag släppa loss koden på dig
. Första är för CAS och andra är för beräkning GCD använda Euklides algoritm (detta kan hittas på många ställen och handledning samt).
Kompilera och köra instruktionerna gcc file_name.c ; ./a.out
Jämför och Swap
# Include# Include / / Exchange - newValue är comperand gamla / förväntat värde / * * Funktion faktiskt gör följande sak - om värdet på * dest är lika med oldvalue sedan ersätta den med newValue annars lämna den oförändrad: inte alla dessa Atomically * * Det finns två alternativ för returvärde * 1.is initiala värdet av * dest och lämna bördan att kalla fxn att jämföra den med oldval * 2. gör det hit och returnera 0 eller 1, bör detta vara effektivare ** / / * Senare ändrar det till 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 result = 1 ;/ * 1 visar att CAS lyckades och 0 visar att det misslyckades * / / * BTW behöver sätta cc för flagga dunkardags! * / __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" / * bör låset på samma linje * / "JZ görs \ n \ t" "MOVL $ 0,% 1 \ n \ t" "KLART: \ n \ t" : "= M" (DEST), "= g" (resultat) : "G" (oldvalue), "g" (newValue), "m" (dest) : "% EAX", "% ebx", "ECX", "CC" ); printf ("(% d,% d,% d)", * DEST, oldvalue, newValue); RETURN RESULT; } / * TODO * Skriva en annan asm fxn som sätter ovan fxn i en while-slinga och fortsätta att försöka om det inte lyckas * / int main () { int en = 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 ("ändra värdet * c till% 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)); returnera 0; }
Formatera anteckningar - verkar som att WP syntax highlighter är att lägga till i slutändan, ignorera det.
GCD
# Includeint gcd (int a, int b) { int resultat; / * Beräkna största gemensamma nämnaren att använda Euklides algoritm * / __asm__ __ volatile__ ("MOVL% 1,%% EAX," "MOVL% 2,%% EBX;" "Forts: cMpl 0 $,%% EBX;" "Je KLAR;" "Xorl%% EDX,%% EDX," "Idivl%% EBX;" "MOVL%% EBX,%% EAX," "MOVL%% EDX,%% EBX;" "JMP forts," "KLAR: MOVL%% EAX,% 0;" "= g" (Resultat): "g" (en), "g" (b) ); RETURN RESULT; } int main () { int första, andra; printf ("Ange två heltal:"); scanf ("% d% d", & första, och andra); printf ("GCD av% d &% d är% d \ n" första, andra, gcd (första, andra)); returnera 0; }
Cricket värld väntar en ny världsordning
Efter en rad spänner fem tester och cirka två månader, England återvunna aska.
Låt oss tala om det vinnande laget först - deras mellersta order är "genomsnittlig" om du inte vill kritisk. Greame Swann bidrag med slagträet räknar inte mindre än bidraget med bollen. Stuart Broad - bästa allround var icke starter för 5: e testet. Andrew Strauss var den enda konsekventa slagman och Jimmy Anderson var den enda konsekventa kastare.
Poängen här är inte att kritisera resultaten av det vinnande laget, men att sätta i perspektiv av att trots alla dessa förlorade Australien. du måste tänka några sekunder om man blir tillfrågad att nämna sitt bästa bowlare. Rätt var det BW Hilfenhaus. Hauritz överträffade everbody förväntningar men var ändå inte bra nog för att väljas för två av de fem proven. South Africa blev aldrig en värld visp utan världsklass spinner kan Australien hoppas på att inte vara en utan ett tillräckligt bra en åtminstone. Magician lämnade scenen och det ser inte ut som konst längre, glöm magi. Ponting står högt bland mindre dödliga och Michael Clarke står upp väldigt ofta, men det gör dem till en grupp med några väldigt bra spelare och inte en mycket bra lag.
Aska 2009 kommer att bli ihågkommen för Andrew Flintoff s sista Ashes, Stuart Bred ankomst som en allt rundare (om han lägger lite mer aska folklore till hans lovande start), och en av de mest talande debut-talet genom tiderna genom att Trott men det kommer också att vara ihågkommen som den punkt där om och men om Australien överlägsenhet slutligen gå till vila, det är över. Inte Missförstå mig att de fortfarande kan gräva Mike Hussey och Stuart Clark, men du känner bidrag tiderna storheter när de går saknas. Ibland kommer påminna dig om sig själva i IPL men de kan inte ersättas. Låt oss känner oss välsignade för att ha sett Warne, McGrath och Gilchrist spela tillsammans och som stöds av Waughs, Ponting, Hyden, Martin och Langer.
Framöver kommer Sydafrika alltid att förbli ett mycket bra lag, men de behöver för att vinna semifinalen och vara mer konsekvent runt om i världen, kommer Pakistan förblir gåtfullt lysande, kommer indiska unga kanoner förmodligen hitta det svårt att fylla skorna av extraordinära föregångare. Sri Lanka bör fortsätta att visa glimtar av konst i hantverk. Men kan vi få vänta någon gång innan du får ett allt ut dominant laget eller innan en kapten klagar över brist på konkurrens, som Steve Waugh en gång gjorde.
På en närstående anmärkning - låt oss välkomna den kommande baksidan av Asif har han ett helvete stor potential, låt oss hoppas att se några av det och också välkomna Andy Flower i den nya awatar, rätt du kan inte hålla goda män ner för länge.
ruby ett foder för att skapa hash
Igår samtidigt gå igenom en av mina gamla program, jag hittade den här skriven av mig någon gång tillbaka:
#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
Att döda några av spänning låt mig avslöja att raw_text ser ut
, Höger har skurits från PayPal betalning bekräftelse.
Ovanför linjen om bryts i delar lyder bättre:
unescaped_array = CGI.unescape (raw_text). Split ('&') unescaped_array = unescaped_array.collect {| x | b = x.split ("="); b.push (noll) vid b.size == 1, b} flattened_array = unescaped_array.flatten hash = Hash [* flattened_array]
Låt oss göra enskilda stegen i IRK:
IRB (huvud):. 009:0> unescaped_array = CGI.unescape (raw_text) Split ('&') => ["Success", "mc_gross = 10,00", "protection_eligibility = Obehörig", "payer_id = U7PPJJ4TSJ47E", "skatt = 0,00", "payment_date = 09:45:30 Jul 10, 2009 PDT", "payment_status = väntan "] IRB (huvud): 013:0> unescaped_array = unescaped_array.map {| x | b = x.split ("="); b.push (noll) om b.size == 1, b} => [["Success", noll], ["mc_gross", "10,00"], ["protection_eligibility", "Obehörig"], ["payer_id", "U7PPJJ4TSJ47E"], ["skatt", "0,00"] , ["payment_date", "09:45:30 Jul 10, 2009 PDT"], ["payment_status", "I väntan"]] IRB (huvud): 014:0> flattened_array = unescaped_array.flatten => ["Success", noll, "mc_gross", "10,00", "protection_eligibility", "Obehörig", "payer_id", "U7PPJJ4TSJ47E", "skatt", "0,00", "payment_date", "09:45: 30 Jul 10, 2009 PDT "," payment_status "," I väntan "] IRB (huvud): 015:0> hash = Hash [* flattened_array] => {"Skatt" => "0,00", "payment_status" => "I väntan", "payer_id" => "U7PPJJ4TSJ47E", "mc_gross" => "10,00", "Success" => noll, "payment_date" = > "09:45:30 Jul 10, 2009 PDT", "protection_eligibility" => "Obehörig"}
BTW, är * kallas splat operatören i ruby
Ett annat sätt att skapa hash från "array av par" är att använda injicera:
hash = [[1,2], [3,4]] injicera ({}). {| Resultat, element | Resultat [element.first] = resultat [element.last]; resultat} Det är ytterligare ett sätt
Skriv en slinga, som jag lämnar som en övning för läsarna!
Här är lite obesläktad användningsfall för att skapa hash från matriser:
IRB (huvud): 005:0> [1,2,3,4,7,9] group_by {| x | x <5.? : Mindre :: större} => {: Mindre => [1, 2, 3, 4],: större => [7, 9]}
Du kan göra fler saker, i princip resultatet av blocket används som nyckel för det elementet i den resulterande hash.
gmail, mutt och msmtp fix
Om du använder mutt och SMTP få tillgång till Gmail. Här är en (dålig) nyheter. Coola killar på Google ändras igen certifikat. Åh, har du frågar - hur gör det veta det? Enkel mutt började klaga på dåliga certifikat när du försöker använda msmpt, ökända "msmtp: TLS Kontrollen misslyckades:. Intyget har inte fått en känd emittentens hälsade på mig på skärmen.
Korsa bekräfta -
Bara köras efter
$ msmtp --serverinfo --host=smtp.gmail.com --tls=on --port=587 --tls-certcheck=off
I stället för gamla Thwate Server nu får du följa i emittenten segment
Issuer:
Common Name: Google Internet Authority
Organization: Google Inc
Country: US
Lyckligtvis fix är enkelt, här är vad du behöver göra på Debian
# apt-get install ca-certificates
# dpkg -s ca-certificates|grep Version
Version: 20090814
Efter detta bara ändra följande rad i dig ~ för /. 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
till
tls_trust_file /usr/share/ca-certificates/mozilla/Equifax_Secure_CA.crt
Git och Enorm Survey
Här är två länkar för undersökning av git (versionshanteringssystem) och fantastisk (fönsterhanterare) samhället. Om du använder någon av dessa, ta ut lite tid att fylla i frågeformuläret. Tänk på det som det enklaste sättet att bidra till den programvara du använder.
Här är länkarna:
Git - http://www.survs.com/survey?id=2PIMZGU0&channel=Q0EKJ3NF54
Awesome - http://www.survs.com/survey?id=8BVEV3FO&channel=BH07CQ040D
Obs - (Som finns på dessa sidor, men i botten
) -
"Om du har aktiverat cookies kan du skicka alltid delvis fylld undersökning och återgå till dina svar vid senare tidpunkt, fylla i det senare."
Sammanfoga hashes i yaml conf-filer
Yaml är ganska praktiskt för att skriva konfigurationsfiler. Primär fördel är att, läser det som textfil. Detta fungerar riktigt bra om din konfigurationsfil är platt (ingen hierarki) och har inga repetitioner.
Om konfigurationer filen har repetitioner då är det logiskt att skilja ut dessa element och återanvända dem. Vad jag menar är - låt oss säga att du din konfigurationsfil ser ut så här:
utveckling: input_location: common_input output_location: dev_location mail: smtp_server: Your_Server login: your_login Lösenord: top_secret produktion: input_location: common_input output_location: dev_location mail: smtp_server: Your_Server login: your_login Lösenord: top_secret
Förutsatt ovanstående kod i / tmp / test.yml här är hur du kan läsa i Python och Ruby
$cat readyml.py
#! / Usr / bin / env python från pprint import pprint som pp # I debian behöver du installera python-yaml från yaml import belastning, load_all, dumpa hash = last (open ("/ tmp / test.yml ')) PP (hash ["utveckling"])
$ cat readyml.rb
#! / Usr / bin / env ruby kräver "PP" hash = yaml :: last (File.open ('/ tmp / test.yml). läsa) PP hash ["utveckling"]
här är en praktisk en liner för Ruby version
$ ruby -rpp -e 'pp YAML::load(File.open("/tmp/a.yml"))["development"]' eller så kan du prova samma sak i IRB eller python konsol.
Notera att i ovanstående kodsträngen är allt annat än produktionen placering är densamma i utveckling och produktion del. Det är där yml nodidentifieraren kommer att rädda. Idén är enkel har en uppsättning standardvärden och åsidosätter dem på annan plats.
Du kan dra isär enligt följande:
defaults: & standard input_location: common_input output_location: dev_location mail: SENDER_NAME: avsändare smtp_server: Your_Server login: your_login Lösenord: top_secret utveckling: <<: * Standard produktion: <<: * Standard output_location: prod_location
$ ruby -rpp -e 'pp YAML::load(File.open("/tmp/a.yml"))["development"]["mail"]["login"]'
"your_login"
$
Bra, det fungerar (tm)!.
Förmodligen har vi handlas viss klarhet för lite magi. Här är ett litet förklaring: &, * och <<: & som är ankartaggen kan förstås som nod identifierare, är * nod referens och <<: står för hash kopplingen.
För mer information se antingen yaml specifikationer eller wikipedia
Så långt så bra men det finns en hake här, dessa hash smälter samman är inte rekursiva. Vad det betyder är detta: låt oss säga att du vill ha olika namn för avsändare post i två miljöer kan du frestas att göra följande:
defaults: & standard input_location: common_input output_location: dev_location mail: SENDER_NAME: avsändare smtp_server: Your_Server login: your_login Lösenord: top_secret utveckling: <<: * Standard mail: SENDER_NAME: sender_dev produktion: <<: * Standard output_location: prod_location mail: SENDER_NAME: sender_prod
Lets kontrollera
$ ruby -rpp -e 'pp YAML::load(File.open("/tmp/a.yml"))["development"]["mail"]["login"]'
nil
$
Oj, något gick fel, problem som nämnts ovan är att hash sammanslagning inte är rekursiv och medan slå ihop den utbytt post om standard per post av produktionen som har endast en nyckel. Lösning / arbete runt är att rulla ut en mer jämn:
common_settings: & common_settings input_location: common_input output_location: dev_location mail_defaults: & mail_defaults SENDER_NAME: avsändare smtp_server: Your_Server login: your_login Lösenord: top_secret defaults: & standard <<: * Common_settings mail: <<: * Mail_defaults utveckling: <<: * Standard produktion: <<: * Standard mail: <<: * Mail_defaults SENDER_NAME: sender_prod
Lets kontrollera igen
$ ruby -rpp -e 'pp YAML::load(File.open("/tmp/a.yml"))["development"]["mail"]["login"]'
"your_login"
$
Sa du att du har en större grad av häckande, och du kan definitivt rulla ytterligare en nivå, men sedan blir det en enda röra. Så, om du inte försöker skriva lösning torn Hanoi i en conf-fil, är det bättre att restucture conf fil än att gräva i yaml eller något annat. Men det är ditt samtal ändå.
Stora programmerare hitta enkla lösningar på komplexa problem
Efter en lång tid kunde jag hitta källan till följande citat-
Junior programmerare skapa enkla lösningar på enkla problem. Senior programmerare skapa komplexa lösningar på komplexa problem. Stora programmerare hitta enkla lösningar på komplexa problem.
Det är från en essä som heter Beautiful Software av Charles Connell.
En annan favorit en av mina är Zen av Python -
Vacker är bättre än fult.
Explicit är bättre än implicit.
Enkelt är bättre än komplex.
Complex är bättre än komplicerat.
Flat är bättre än nästlade.
Glesa är bättre än tät.
Läsbarhet räknas.
Särskilda fall inte särskilt tillräckligt för att bryta mot reglerna.
Även praktiska slår renhet.
Fel ska aldrig gå tyst.
Inte uttryckligen tystas.
Mot bakgrund av tvetydighet vägrar frestelsen att gissa.
Det bör finnas en och företrädesvis endast en-uppenbart sätt att göra detta.
Även på det sättet kanske inte är självklart i början om du inte är holländska.
Nu är bättre än aldrig.
Även aldrig är ofta bättre än * höger * nu.
Om genomförandet är svårt att förklara, det är en dålig idé.
Om genomförandet är lätt att förklara, kan det vara en bra idé.
Namnutrymmen är en tutande bra idé - låt oss göra mer av dem!
-------------------------
och sedan finns det klassiker Tao of Programming
-
krediter som på den länkade webbplatsen-
Översatt av Geoffrey James
Kopierat av Duke Hillard
Sänds av Anupam Trivedi, Sajitha Tampi och Meghshyam Jagannath
Re-html-ized och redigerad av Kragen Sittler
-
Bok 1 - The Silent Void
Således talade befälhavaren programmeraren:
"När du har lärt sig att rycka felkoden från fällan ramen det
kommer att vara dags för dig att lämna. "1,1
Något mystiskt bildas, född i den tysta tomrummet. Väntar ensam och
orörlig, är det på en gång ändå och ändå i ständig rörelse. Det är källan
av alla program. Jag vet inte dess namn, så jag kommer att kalla det Tao
Programmering.Om Tao är bra, då operativsystemet är stor. Om operativsystemet
Systemet är bra, då kompilatorn är stor. Om kompilatorn är stor,
då ansökan är stor. Användaren är nöjd och det finns
harmoni i världen.Tao of Programming flyter långt bort och avkastning på vinden på morgonen.
1,2
Tao födde maskinkod. Maskinkod födde
assembler.Den assembler födde kompilatorn. Nu finns 10 tusen
språk.Varje språk har sitt syfte, men ödmjuk. Varje språk uttrycker
Yin och Yang av programvara. Varje språk har sin plats i Tao.Men inte programmet inte i COBOL om du kan undvika det.
1,3
I början var Tao. Tao födde tid och rum.
Därför tid och rum är Yin och Yang programmering.Programmerare som inte förstå Tao är alltid ont om tid
och utrymme för sina program. Programmerare som förstå Tao alltid
har tillräckligt med tid och utrymme för att uppnå sina mål.Hur skulle det kunna vara annorlunda?
1,4
Den vise Programmeraren berättas om Tao och följer den. Den genomsnittliga
programmeraren berättade om Tao och söker för det. Dåren programmeraren
berättas om Tao och skrattar åt det.Om det inte vore för skratt, skulle det inte finnas någon Tao.
De högsta ljud är svårast att höra.
Framöver är ett sätt att dra sig tillbaka.
Stor talang visar sig sent i livet.
Även en perfekt program har fortfarande buggar.-------------------------
Bok 2 - De gamla mästarna
Således talade befälhavaren programmeraren:
"Efter tre dagar utan programmering, blir livet meningslöst."
2,1
Programmerarna av gammal var mystisk och djup. Vi kan inte förstå
sina tankar, så allt vi gör är beskriver sitt utseende.Aware, som en räv korsar vattnet. Ringer, som en allmän på
slagfält. Kind, som en värdinna hälsar sina gäster. Enkel, liksom
uncarved block av trä. Ogenomskinlig, som svarta pooler i mörka grottor.Vem kan berätta hemligheter deras hjärtan och sinnen?
Svaret finns bara i Tao.
2,2
Grand Master Turing drömde en gång att han var en maskin. När han vaknade han
utbrast:"Jag vet inte om jag Turing drömmer att jag är en maskin, eller en
Maskinen drömmer att jag Turing! "2,3
En programmerare från ett mycket stort dataföretag gick till en programvara
konferens och återvände sedan rapportera till sin chef och sade: "Vad för slags
av programmerare arbetar för andra företag? De uppförde sig illa och var
obekymrade med framträdanden. Deras hår var långt och ovårdade och deras
kläder var skrynkliga och gamla. De kraschade vår gästfrihet suite och de
gjorde ohyfsade ljud under min presentation. "Chefen sa: "Jag skulle aldrig ha skickat dig till konferensen. De
programmerare lever bortom den fysiska världen. De anser livet absurt, ett
oavsiktlig slump. De kommer och går utan att veta begränsningar.
Utan en vård de lever bara för sina program. Varför skulle de bry sig
med sociala konventioner?"De lever i Tao."
2,4
En novis frågade Mästaren: "Här är en programmerare som aldrig designar,
dokument eller tester sina program. Men alla som känner honom ser honom som en av
bästa programmerare i världen. Varför är det här? "Mästaren svarar: "Det programmeraren har bemästrat Tao. Han har gått
bortom behovet av design, att han inte blir arg när systemet
krascher accepterar men universum utan oro. Han har gått längre än
behovet av dokumentation, han inte längre bryr sig om någon annan ser sin kod.
Han har gått längre än det behövs för testning, vart och ett av hans program är perfekt
inom sig själva, fridfull och elegant, deras syfte självklart. Sannerligen,
Han har gått mysterium Tao. "-------------------------
Boka 3 - Design
Således talade befälhavaren programmeraren:
"När programmet testas, är det för sent att göra design
förändringar. "3,1
Det var en gång en man som gick till en dator mässa. Varje dag som han
in, berättade mannen vakten vid dörren:"Jag är en stor tjuv, känd för mina bedrifter för snatteri. Var
förvarnad, skall för denna handel visar inte fly unplundered. "Detta tal störde vakten mycket, eftersom det fanns miljoner
dollar i datorutrustning inne, så han såg mannen noggrant. Men
Mannen vandrade bara från monter till monter, nynna tyst för sig själv.När mannen lämnade tog vakten honom åt sidan och sökte sina kläder, men
ingenting var att finna.På nästa dag mässan, återvände mannen och bannade vakten
säger: "Jag flydde med en stor byte igår, men idag kommer att bli ännu
bättre. "Så vakten såg honom allt närmare, men till ingen nytta.På den sista dagen av mässan kunde vakten hålla hans nyfikenhet
inte längre. "Sir Thief", sade han, "jag är så förbryllad, jag kan inte leva i
fred. Vänligen upplysa mig. Vad är det som ni stjäla? "Mannen log. "Jag stjäla idéer", sade han.
3,2
Det en gång var en mästare programmerare som skrev ostrukturerade program. En
nybörjare programmerare, i syfte att imitera honom, började också skriva
ostrukturerade program. När nybörjare bad befälhavaren att utvärdera sin
framsteg, kritiserade befälhavaren honom för att skriva ostrukturerade program,
säger, "vad som är lämpligt för befälhavaren inte är lämplig för
nybörjare. Du måste förstå Tao innan överskrider struktur. "3,3
Det var en gång en programmerare som fästes till domstolen i krigsherren
Wu. Krigsherren frågade programmeraren: "Vilket är lättare att utforma: en
redovisning paket eller ett operativsystem? ""Ett operativsystem", svarade programmerare.
Krigsherren uttalade ett utrop av misstro. "Säkerligen en redovisning
Paketet är trivialt intill komplexiteten i ett operativsystem ", säger han
sa."Inte så", sade programmeraren "när man utformar en redovisning paket,
programmeraren fungerar som medlare mellan människor med olika
idéer: hur det måste fungera, hur dess rapporter skall visas, och hur det ska
överensstämma med skattelagstiftningen. Däremot är ett operativsystem inte begränsat
av externa framträdanden. Vid utformning av ett operativsystem, programmeraren
söker enklaste harmoni mellan maskin och idéer. Det är därför ett
operativsystem är lättare att konstruera. "Krigsherren Wu nickade och log. "Det är allt gott och väl, men
som är lättare att felsöka? "Programmeraren svarade inte.
3,4
En chef gick till befälhavaren programmerare och visade honom de krav
dokument för en ny ansökan. Chefen frågade Mästaren: "Hur länge
kommer det att ta att utforma detta system om jag tilldelar fem programmerare till det? ""Det kommer att ta ett år", sade befälhavaren snabbt.
"Men vi behöver detta system omedelbart eller ens tidigare! Hur lång tid tar det
ta om jag tilldela tio programmerare till det? "Befälhavaren programmerare rynkade pannan. "I så fall kommer det att ta två år."
"Och om jag tilldelar hundra programmerare till det?"
Befälhavaren programmerare ryckte på axlarna. "Då designen kommer aldrig att bli
klar ", sade han.-------------------------
Bok 4 - Kodning
Således talade befälhavaren programmeraren:
"En välskriven programmet är dess egen himmel, en dåligt skriven programmet är
sin egen helvetet. "4,1
Ett program ska vara lätt och smidig, dess subrutiner ansluten som en
pärlband. Andan och avsikten med programmet bör behållas
överallt. Det bör varken vara för lite eller för mycket, varken
onödiga loopar eller meningslösa variabler, ingen brist på struktur eller
överväldigande styvhet.Ett program bör följa det så kallade lagen om minst Häpnad ". Vad är detta lag?
Det är helt enkelt att programmet alltid ska svara på användaren i vägen
att förvånar honom minst.Ett program, oavsett hur komplicerad, bör fungera som en enda enhet. Programmet
bör ledas av logiken inom snarare än av yttre utseenden.Om programmet inte i dessa krav kommer det vara i ett tillstånd av
oordning och förvirring. Det enda sättet att rätta till detta är att skriva om
programmet.4,2
En novis frågade Mästaren: "Jag har ett program som någon gång driver och
ibland avbryter. Jag har följt reglerna för programmering, men jag
helt bafflad. Vad är orsaken till detta? "Befälhavaren svarade: "du är förvirrad eftersom du inte förstår Tao.
Endast en dåre förväntar rationellt beteende från sina medmänniskor. Varför tror du
förväntar sig det från en maskin som människan har konstruerat? Datorer simulera
determinism, endast Tao är perfekt."Reglerna för programmering är övergående, bara Tao är evig. Därför
du måste fundera Tao innan du får upplysning. ""Men hur vet jag när jag har fått upplysning?" Frågade
nybörjare."Ditt program kommer då att fungera", svarade mästaren.
4,3
En mästare har förklarar vilken typ av Tao av att en av hans noviser. "The
Tao är inbakat i alla program - oavsett hur obetydlig ", säger
befälhavaren."Är Tao i en handhållen miniräknare?" Frågade nybörjare.
"Det är" kom svaret.
"Är Tao i ett spel?", Fortsatte nybörjare.
"Det är ännu i ett spel", sa mästaren.
"Och är Tao i DOS för en dator?"
Befälhavaren hostade och skiftade sin position något. "Lärdomen är över
för idag ", sade han.4,4
Prins Wangs programmerare var kodning programvara. Hans fingrar dansade på
tangentbord. Programmet kompileras utan ett felmeddelande och programmet
sprang som en mild vind."Excellent!" Prinsen utropade: "Din teknik är felfri!"
"Teknik", sade programmeraren vända från sin terminal "Vad jag
följer är Tao - över alla tekniker! När jag först började att programmera I
skulle se framför mig hela problemet i ett massa. Efter tre år har jag inga
längre tid såg denna massa. Istället använde jag subrutiner. Men nu ser jag ingenting.
Hela min varelse existerar i en formlös tomrum. Mina sinnen är i viloläge. Min ande,
fri att arbeta utan plan, följer sin egen instinkt. Kort sagt, mitt program
skriver självt. Sant, ibland finns det svåra problem. Jag ser dem
kommer jag sakta ner, titta jag tyst. Då ska jag ändra en enda rad kod
och de svårigheter försvinna som puffar för tomgång rök. Jag sammanställa sedan
programmet. Jag sitter stilla och låta glädjen av arbetet fylla min varelse. Jag avslutar min
ögon för en stund och sedan logga ut. "Prince Wang sade: "Skulle att alla mina programmerare var klok!"
-------------------------
Bok 5 - Underhåll
Således talade befälhavaren programmeraren:
"Även om ett program, men tre rader lång dag kommer det att vara
bibehålls. "5,1
En väl använt dörren behöver ingen olja på sina gångjärn.
En snabb-flödande strömmen växer inte stillastående.
Varken ljud eller tankar kan färdas genom ett vakuum.
Mjukvara ruttnar om den inte används.Dessa är stora mysterier.
5,2
En chef frågade en programmerare hur lång tid det skulle ta honom för att avsluta
program där han arbetade. "Det kommer att vara färdig i morgon," den
programmeraren svarade omgående."Jag tror att du är orealistiskt", sade chefen: "Sanningsenligt, hur
lång tid tar det? "Programmeraren tänkte efter en stund. "Jag har några funktioner som jag vill
tillägga. Detta kommer att ta minst två veckor ", sade han till slut."Även det är för mycket att förvänta sig", insisterade chef, "jag kommer att vara
nöjd om du bara tala om för mig när programmet är klar. "Programmeraren gick med på detta.
Flera år senare drog chefen. På väg till sin pensionering
lunch, upptäckte han programmeraren sover på sin terminal. Han hade varit
programmering hela natten.5,3
En novis programmerare var en gång tilldelats koda ett enkelt ekonomiskt paket.
Nybörjare arbetade ursinnigt för många dagar, men när hans herre omdömet
sitt program, upptäckte han att den innehöll en textredigeraren, en uppsättning
generaliserad grafik rutiner, en artificiell intelligens gränssnitt, men
inte den minsta omnämnandet av något ekonomiskt.När befälhavaren frågade om detta, blev nybörjare upprörd. "Var inte
så otålig, "sade han," Jag lägger i det finansiella grejer så småningom. "5,4
Struntar en bra bonde en gröda han har planterat?
Har utsikt över en bra lärare även de mest ödmjuka student?
Tillåter en bra pappa ett barn att svälta?
Vägrar en bra programmerare för att behålla sin kod?-------------------------
Bok 6 - Ledning
Således talade befälhavaren programmeraren:
"Låt programmerare är många och de chefer få - då alla kommer att
produktiv. "6,1
När chefer håller ändlösa möten, programmerare skriver spel. 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. Den
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
sa.“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"



































