pesquisa, ping, pubsub, pubsubhub, PubSubHubbub
Caso você esteja cético, há um método na loucura acima, no título do post. Em círculos de tecnologia é pouco provável que você nunca ouviu falar de PubSubHubbub. Em rápidas meses, tem sido um dos três primeiros falou sobre as coisas. Outros dois são a criptografia homomórfica e Google onda [ 1. ]. Voltando ao posto atual - termos no título indique como obter o conteúdo de outras pessoas. Seguintes detalhes tornam-se mais claro, se você imaginar as coisas acontecendo no que diz respeito aos blogs, mesmo que eles não são conceitualmente restrito a blogs.
Polling refere-se ao cenário onde os clientes continuam perguntando o servidor se algo de novo surgiu. Quantas vezes para pedir atualizações será sempre um problema com votação muito freqüente ou muito freqüente, mas como um leitor apontou aqui que uma coisa grande, com pesquisas é que o servidor não precisa manter o estado.
Ping refere-se ao caso em que quando postar um artigo, você (ou seu software) também atualiza alguns populares serviços (central) de atualização. Alguns fundo aqui .
Em seguida é pubsub que significa publish / subscribe, um dos primeiros passo para isso foi feito aqui por Evan Henshaw-Plath e Kellan Elliott-McCrea (72 slides, mas vale a pena ir through). Exemplo convincente deram contra era isso - em uma data específica, Friendfeed rastreado Flickr 2,9 milhões de vezes para obter as últimas fotos de 45,754 usuários, dos quais 6.721 tinham visitado Flickr nessas 24 horas e poderia ter 'potencialmente' upload de uma foto. Note-se que o que eles propuseram não era uma nova tecnologia, como eles apontam "nova e revolucionária tecnologia de 20 anos". Se fazê-lo para blogs, em seguida, um dos principais problemas com XMPP - sobrecarga presença de dados, que pode ser tão elevada como 60-70% pode ser muito reduzida.
pubsubhub está para publicar hub subscribe e PubSubHubbub é um protocolo, o núcleo do que é idéia de pubsubhub. Editores em que (dizem blogueiros) atualizar o hub que (pode ser mais de um cubos, que falam entre si) reside "em algum lugar na nuvem", conforme o protocolo que pode ser empurrar ou puxar de acordo com o protocolo, mas o próximo elo na hub cadeia, para o cliente (digamos leitores) é sempre empurrar modelo. Esta página é bom ponto de partida para PubSubHubbub, slides visão geral são boas. Sempre eloqüente Anil Dash descreve aqui como botão web.
Duas outras leituras relacionadas são webhooks que é basicamente callbacks http. Github utiliza -lo, o mesmo acontece com paypal para notificações assíncronas de pagamento no IPN . Assim como muitos outros. Conceito relacionado é rssCloud que é novo hub pubsub. Siga este link para mais detalhes.
Você pode estar se perguntando qual é o ponto de escrever tudo isso aqui, há dois 1. Estas coisas valem a pena conhecer, minimamente, pelo menos, e 2. Este blog é PubSubHubbub habilitado agora via appspot hub usando este wordpress plugin de consumo humano e animal também é PubSubHubbub habilitado via feedburner link, aqui
-
[ 1 ]. - Bom introdutório ler para criptografia totalmente homomórfica é este artigo por Bruce Schneier e essa conversa é mais ou menos única fonte para a onda do Google.
-UPDATE - Este post explica como a exigência de servidor público para retorno de chamada pode ser contornado para clientes desktop usando portal xmpp (para PubSubHubbub).
Um pouco de montagem
Depois de ler este artigo sobre buffers Lock Free e vendo o uso de CAS (comparar e trocar), me senti como postar o código assembly para fazer o mesmo. Use caso ali era escrever um método nativo e chamá-lo de Java (de volta em 1,5, quando as estruturas de dados concorrentes em Java eram mais ou menos não existe). Sem mais delongas, eu vou liberar o código para você
. O primeiro é para a CAS ea segunda é para a computação GCD usando o algoritmo de Euclides (este pode ser encontrado em muitos lugares e tutoriais bem).
Compilar e executar instruções gcc file_name.c ; ./a.out
Compare e Swap
# Include# Include / / Troca - newvalue, comperand é velho / valor esperado / * * Função realmente faz a coisa seguinte - se o valor no * dest é igual a OldValue, em seguida, substituí-lo por newvalue mais deixá-lo inalterado: não tudo isso atomicamente * * Há duas opções para o valor de retorno * O valor inicial de 1.is * dest e deixam o ônus da fxn chamando a compará-lo com oldval * 2. fazê-lo por aqui e retornar 0 ou 1, esta deve ser mais eficiente ** / / * Depois transformá-lo em 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 resultado = 1 ;/ * 1 mostra que cas conseguiram e 0 mostra que ele falhou * / / * Btw precisa definir cc para sobrepor bandeira! * / volatile__ __ __asm__ ( "Movl% 2,%% eax \ n \ t" "Movl% 3,%% ebx \ n \ t" "0% movl%% ecx \ n \ t" "LOCK \ n \ t" "Cmpxchg ebx%%, (%% ecx) \ n \ t" / * deve bloquear ser na mesma linha * / "Jz FEITO \ n \ t" "Movl $ 0,% 1 \ n \ t" "FEITO: \ n \ t" : "= M" (dest), "= g" (resultado) : "G" (OldValue), "g" (newvalue), "m" (dest) : "% Eax", "% ebx", "ecx", "cc" ); printf ("(% d,% d,% d)", * dest, OldValue, newvalue); resultado de retorno; } / * TODO * Escrever outro fxn asm que coloca acima fxn em um loop while e continuar tentando, a menos que ele consegue * / 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 ("valor de troca de 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)); retornar 0; }
Notas de formatação - parece marcação de sintaxe wp está adicionando no final, ignorar isso.
GCD
# Includeint mdc (int a, int b) { int resultado; / * Compute Máximo divisor comum usando o algoritmo de Euclides * / volatile__ __asm__ __ ("movl% 1,%% eax;" "Movl% 2,%% ebx;" "Cont.: cmpl $ 0,%% ebx;" "Je FEITO"; "Xorl%% edx,% edx%;" "Idivl%% ebx;" "Ebx movl%%%% eax;" "Movl% edx%, ebx%%"; "Jmp cont.;" "FEITO: movl% eax%, 0%;": "= g" (resultado): "g" (a), "g" (b) ); resultado de retorno; } int main () { int primeiro, segundo; printf ("Entre com dois inteiros:"); scanf ("% d% d", e em primeiro lugar, e segundo); printf ("GCD de% d &% d é% d \ n", primeiro, segundo, mdc (primeiro, segundo)); retornar 0; }
Mundial de críquete Aguarda uma Nova Ordem Mundial
Depois de uma série que abrange cinco testes e cerca de dois meses, cinzas Inglaterra recuperados.
Vamos falar sobre a equipe vencedora primeiro - a ordem do meio é "médio" se você não quer crítica. Contribuição Greame Swann com o bastão vai contar nada menos do que a contribuição com a bola. Stuart Broad - melhor polivalente foi de arranque não para o teste 5. Andrew Strauss era o batedor apenas consistente e Jimmy Anderson foi o jogador apenas consistente.
Ponto aqui não é para repreender as conquistas do time vencedor, mas para colocar em perspectiva o fato de que, apesar de todos estes, Austrália perdeu. você vai ter que pensar por alguns segundos, se convidados a nomear o seu melhor jogador. Certo, era BW Hilfenhaus. Hauritz superou expectativa toda a gente, mas ainda não era suficientemente bom para ser selecionado para dois dos cinco testes. África do Sul nunca se tornou um batedor mundo sem um spinner de classe mundial, a Austrália não pode ter esperança de ficar um sem um bom o suficiente, pelo menos. Mago deixou o palco e ele não se parece com arte mais, esquecer a magia. Ponting ergue-se entre os mortais e Michael Clarke levanta-se muito frequentemente, mas que faz uma equipe com alguns jogadores muito bons e não um time muito bom.
Cinzas de 2009 será lembrado por Ashes últimos Andrew Flintoff de, a chegada Stuart Broad como um polivalente (se acrescenta um pouco mais do folclore Ashes ao seu início promissor), e um do século estréia mais revelador de todos os tempos por Trott, mas também será lembrado como o ponto onde ifs e buts sobre a supremacia da Austrália foram finalmente para descansar, acabou. Não me interpretem mal eles ainda podem descobrir Mike Hussey ou Stuart Clark, mas você sente a contribuição de todos os grandes nomes do momento em que eles desaparecem. Às vezes eles vêm para lembrá-lo de si em IPL, mas eles ainda não podem ser substituídos. Vamos sinto abençoada por ter visto Warne, McGrath e Gilchrist tocar juntos e sendo apoiado por Waughs, Ponting, Hyden, Martin e Langer.
Indo para a frente, África do Sul será sempre uma equipa muito boa, mas eles precisam ganhar semifinais e ser mais consistente em torno do globo, do Paquistão permanecerá enigmático brilhante, indianos armas jovens provavelmente vai achar difícil de encher os sapatos de antecessores extraordinárias. Sri Lanka deve continuar a mostrar lampejos de arte em artesanato. Mas, vamos ter de esperar algum tempo antes de ter um time todo para fora dominante ou antes de um capitão reclama de falta de concorrência, como Steve Waugh fez uma vez.
Em uma nota relacionada - vamos saudar o regresso da Asif, ele tem um inferno lote de potencial, vamos esperar para ver alguns dos que e igualmente bem-vindos Andy Flower no awatar novo, certo que você não pode manter os homens bons para baixo por muito tempo.
ruby forros para criar um hash de
Ontem ao atravessar um dos meus programas antigos, encontrei este escrito por mim algum tempo atrás:
#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
Para matar um pouco de suspense, deixe-me revelar que raw_text parece
, Direito que foi cortado da confirmação de pagamento paypal.
Acima da linha se quebrado em partes lê melhor:
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]
Vamos fazer os passos individuais no irb:
irb (main):. 009:0> = unescaped_array CGI.unescape (raw_text) split ('&') => ["SUCESSO", "mc_gross = 10,00", "protection_eligibility = inelegíveis", "payer_id = U7PPJJ4TSJ47E", "imposto = 0,00", "payment_date = 09:45:30 10 de julho de 2009 PDT", "payment_status = Pendente "] irb (main): 013:0> = unescaped_array unescaped_array.map {| x | b = x.split ("="); b.push (zero) se b.size == 1; b} => [["SUCESSO", nil], ["mc_gross", "10,00"], ["protection_eligibility", "não elegíveis"], ["payer_id", "U7PPJJ4TSJ47E"], ["imposto", "0.00"] , ["payment_date", "09:45:30 10 de julho de 2009 PDT"], ["payment_status", "Pendente"]] irb (main): 014:0> = flattened_array unescaped_array.flatten => ["SUCESSO", nil, "mc_gross", "10,00", "protection_eligibility", "não elegíveis", "payer_id", "U7PPJJ4TSJ47E", "imposto", "0.00", "payment_date", "09:45: 30 10 de julho de 2009 PDT "," payment_status "," Pendente "] irb (main): 015:0> hash = Hash [* flattened_array] => {"Imposto" => "0,00", "payment_status" => "Pendente", "payer_id" => "U7PPJJ4TSJ47E", "mc_gross" => "10,00", "SUCESSO" => nil, "payment_date" = > "09:45:30 10 de julho de 2009 PDT", "protection_eligibility" => "não elegíveis"}
BTW, * é chamado de operador splat em ruby
Outra maneira de criar hash de "matriz de pares 'é usar injetar:
hash = [[1,2], [3,4]] injetar ({}). {| resultado, elemento | resultado [element.first] = result [element.last];} resultado Não é mais uma maneira
Escreva um loop, que eu vou deixar como um exercício para os leitores!
Aqui está um caso de uso pouco independente de criação de hash a partir de matrizes:
irb (main): 005:0> [1,2,3,4,7,9] group_by {| x | x <5.? : Menor :: maior} => {: Menor => [1, 2, 3, 4],: maior => [7, 9]}
Você pode fazer mais coisas, basicamente resultado do bloco é usado como a chave para esse elemento no hash resultante.
correção gmail, mutt e msmtp
Se você usa o mutt e SMTP para acessar o Gmail. Aqui está uma notícia (ruim). Rapaziada do Google mudou novamente certificado. Oh, se você perguntar - como ele sabe? Mutt simples começou a reclamar sobre o certificado mal ao tentar usar msmpt, infame "msmtp: verificação do certificado TLS falhou:. O certificado não tem um emissor conhecido" cumprimentou-me na tela.
Para cruzar confirmar -
Basta executar o seguinte
$ msmtp --serverinfo --host=smtp.gmail.com --tls=on --port=587 --tls-certcheck=off
No lugar do Servidor Thwate velho agora você se seguindo no segmento emissor
Issuer:
Common Name: Google Internet Authority
Organization: Google Inc
Country: US
Felizmente correção é simples, aqui está o que você precisa fazer no debian
# apt-get install ca-certificates
# dpkg -s ca-certificates|grep Version
Version: 20090814
Após isso apenas alterar a linha seguinte em você ~ /. 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
para
tls_trust_file /usr/share/ca-certificates/mozilla/Equifax_Secure_CA.crt
Git e Pesquisa Incríveis
Aqui estão dois links para pesquisa de git (sistema de controle de versão) e comunidade (gerenciador de janelas) impressionante. Se você usar qualquer um deles, por favor, tire algum tempo para preencher o questionário. Pense nisso como a maneira mais simples de contribuir de volta para o software que você usa.
Aqui estão os links:
Git - http://www.survs.com/survey?id=2PIMZGU0&channel=Q0EKJ3NF54
Awesome - http://www.survs.com/survey?id=8BVEV3FO&channel=BH07CQ040D
Nota - (como encontrado nas páginas mas na parte inferior
) -
"Se você tiver cookies ativados, você pode sempre apresentar levantamento parcialmente cheio, e retornar às suas respostas em tempo mais tarde, completando mais tarde."
Mesclando hashes em conf yaml
YAML é bastante útil para gravação de arquivos de configuração. Principal vantagem é que, lê-se como arquivo de texto. Isso funciona muito bem se o seu arquivo de configuração é plana (sem hierarquia) e não tem repetições.
Se o seu arquivo de configurações tem repetições, então faz sentido para separar esses elementos e reutilizá-los. O que quero dizer é isso - vamos dizer que você seu arquivo de configuração parecida com esta:
desenvolvimento: input_location: common_input output_location: dev_location mail: smtp_server: Your_Server login: your_login senha: top_secret produção: input_location: common_input output_location: dev_location mail: smtp_server: Your_Server login: your_login senha: top_secret
Supondo que o código acima em / tmp / test.yml aqui está como você pode ler em python e ruby
$cat readyml.py
#! / Usr / bin / env python de pprint pprint importação em pp # No debian precisa instalar python-yaml yaml de importação, despejo load_all carga, hash = carga (open ('/ tmp / test.yml')) pp (hash ['desenvolvimento'])
$ cat readyml.rb
#! / Usr / bin / env ruby require 'pp' hash = YAML :: load (File.open ('/ tmp / test.yml'). ler) de hash pp ['desenvolvimento']
aqui é um forro de uma mão para a versão ruby
$ ruby -rpp -e 'pp YAML::load(File.open("/tmp/a.yml"))["development"]' ou você pode tentar o mesmo em irb ou console python.
Note-se que no trecho de código acima, tudo é diferente do local de saída é a mesma no desenvolvimento e na parte de produção. Este é o lugar onde identificador do nó yml vem resgatar. Idéia é simples ter um conjunto de valores padrão e substituí-los em lugar diferente.
Você pode puxá-lo para além da seguinte forma:
padrões e padrões: input_location: common_input output_location: dev_location mail: SENDER_NAME: remetente smtp_server: Your_Server login: your_login senha: top_secret desenvolvimento: <<: * Os padrões produção: <<: * Os padrões output_location: prod_location
$ ruby -rpp -e 'pp YAML::load(File.open("/tmp/a.yml"))["development"]["mail"]["login"]'
"your_login"
$
Grande, ele funciona (tm)!.
Provavelmente nós trocamos um pouco de clareza para um pouco de magia. Aqui está uma pequena explicação: &, * e <<: & que é marca de âncora pode ser entendida como identificador de nó, * é nó de referência e <<: representa a junção de hash.
Para mais detalhes veja tanto especificações yaml ou wikipedia
Até aí tudo bem, mas há um problema aqui, estas fusões de hash não são recursivas. O que isso significa é o seguinte: digamos que você quer ter nome de remetente diferente para o correio em dois ambientes, você pode ser tentado a fazer o seguinte:
padrões e padrões: input_location: common_input output_location: dev_location mail: SENDER_NAME: remetente smtp_server: Your_Server login: your_login senha: top_secret desenvolvimento: <<: * Os padrões mail: SENDER_NAME: sender_dev produção: <<: * Os padrões output_location: prod_location mail: SENDER_NAME: sender_prod
Vamos verificar
$ ruby -rpp -e 'pp YAML::load(File.open("/tmp/a.yml"))["development"]["mail"]["login"]'
nil
$
Opa, algo deu errado, como já mencionado problema é que a junção de hash não é recursivo e enquanto fundindo-substituído e-mail de incumprimento por e-mail da produção que tem apenas uma chave. Solução / trabalho em torno é para desenrolar mais um nível:
common_settings: & common_settings input_location: common_input output_location: dev_location mail_defaults: & mail_defaults SENDER_NAME: remetente smtp_server: Your_Server login: your_login senha: top_secret padrões e padrões: <<: * Common_settings mail: <<: * Mail_defaults desenvolvimento: <<: * Os padrões produção: <<: * Os padrões mail: <<: * Mail_defaults SENDER_NAME: sender_prod
Vamos verificar novamente
$ ruby -rpp -e 'pp YAML::load(File.open("/tmp/a.yml"))["development"]["mail"]["login"]'
"your_login"
$
Será que você diz que tem um nível de aninhamento mais, bem, você pode definitivamente desenrolar mais um nível, mas depois torna-se uma bagunça. Então, se você não está tentando escrever solução para torres de Hanói em um arquivo conf, é melhor restucture arquivo conf de cavar yaml ou qualquer outra coisa. Mas isso é a chamada de qualquer maneira.
Grandes programadores encontrar soluções simples para problemas complexos
Depois de muito tempo eu poderia encontrar a fonte para seguir aspas
Programadores júnior criar soluções simples para problemas simples. Programadores seniores criar soluções complexas para problemas complexos. Grandes programadores encontrar soluções simples para problemas complexos.
É a partir de um ensaio chamado Software bonito por Charles Connell.
Outra das minhas favoritas é O Zen de Python -
Bonito é melhor que feio.
Explícito é melhor que implícito.
Simples é melhor que complexo.
Complexo é melhor do que complicado.
Plano é melhor que aninhado.
Esparso é melhor que denso.
Legibilidade conta.
Casos especiais não são especiais o suficiente para quebrar as regras.
Embora praticidade bate pureza.
Erros nunca deveriam passar em silêncio.
A menos que explicitamente silenciados.
Diante da ambigüidade, recuse a tentação de adivinhar.
Deve haver um e de preferência apenas uma maneira óbvia para o fazer.
Apesar de que forma pode não ser óbvio à primeira vista, a menos que você seja holandês.
Agora é melhor do que nunca.
Embora nunca é freqüentemente melhor do que o * direito * agora.
Se a implementação é difícil de explicar, é uma má idéia.
Se a implementação é fácil de explicar, pode ser uma boa idéia.
Namespaces são uma grande idéia honking - vamos fazer mais desses!
-------------------------
e depois há o clássico Tao da Programação
-
créditos como no site-ligada
Traduzido por Geoffrey James
Transcrito por Duke Hillard
Transmitida por Anupam Trivedi, Tampi Sajitha e Jagannath Meghshyam
Re-html-ized e editado por Kragen Sittler
-
Livro 1 - O vazio silencioso
Assim falou o mestre programador:
"Quando você aprendeu a roubar o código de erro a partir do quadro armadilha, ele
haverá tempo para você deixar. "1,1
Algo misterioso é formado, nascido no vazio silencioso. Esperar sozinho e
imóvel, é ainda de uma só vez e ainda em movimento constante. É a fonte
de todos os programas. Eu não sei seu nome, por isso vou chamá-lo o Tao da
Programação.Se o Tao é grande, então o sistema operacional é grande. Se a operação
sistema é grande, então o compilador é grande. Se o compilador é grande,
então a aplicação é grande. O usuário tem o prazer e existe
harmonia no mundo.O Tao da Programação flui longe e retornos sobre o vento da manhã.
1,2
O Tao deu à luz a linguagem de máquina. Linguagem de máquina deu origem ao
assembler.A montadora deu à luz o compilador. Agora, há 10.000
idiomas.Cada linguagem tem seu propósito, por mais humilde. Cada linguagem expressa o
Yin e Yang do software. Cada idioma tem seu lugar dentro do Tao.Mas não se programar em COBOL se você pode evitá-lo.
1,3
No início era o Tao. O Tao deu origem ao espaço e tempo.
Portanto Espaço eo Tempo são Yin e Yang da programação.Os programadores que não compreendem o Tao estão sempre correndo contra o tempo
e espaço para seus programas. Os programadores que compreendem o Tao sempre
tem bastante tempo e espaço para realizar seus objetivos.Como poderia ser de outra forma?
1,4
O programador sábio é dito sobre o Tao eo segue. A média
programador é dito sobre o Tao e as buscas por ele. O programador tolo
é dito sobre o Tao e ri para ele.Se não fosse para rir, não haveria Tao.
Os tons mais altos são os mais difíceis de ouvir.
Daqui para frente é uma forma de recuar.
Grande talento revela-se mais tarde na vida.
Mesmo um programa perfeito ainda tem bugs.-------------------------
Livro 2 - Os antigos mestres
Assim falou o mestre programador:
"Depois de três dias sem programação, a vida fica sem sentido."
2,1
Os programadores de antigamente eram misteriosas e profundas. Nós não podemos imaginar
seus pensamentos, portanto, tudo o que fazemos é descrever a sua aparência.Consciente, como uma raposa atravessar a água. Alertar, como um general no
campo de batalha. Tipo, como uma hostess cumprimentando seus convidados. Simples, como
uncarved blocos de madeira. Opaco, como poços negros em cavernas escuras.Quem pode contar os segredos de seus corações e mentes?
A resposta só existe no Tao.
2,2
Grand Master Turing uma vez sonhou que era uma máquina. Quando ele acordou, ele
exclamou:"Eu não sei se estou sonhando Turing que eu sou uma máquina, ou um
máquina de sonhar que estou Turing! "2,3
Um programador de uma empresa de computadores muito grande foi a um software
conferência e, em seguida, retornou para informar ao seu gerente, dizendo: "Que tipo
de programadores trabalham para outras empresas? Eles se comportaram mal e foram
despreocupado com as aparências. Seu cabelo era longo e despenteado e sua
roupas eram enrugado e velho. Bateram nossa suite de hospitalidade e eles
fazia ruídos rudes durante minha apresentação. "O gerente disse: "Eu nunca deveria ter te enviado à conferência. Aqueles
programadores vivem além do mundo físico. Eles consideram a vida absurda, uma
coincidência acidental. Eles vêm e vão sem saber limitações.
Sem um cuidado, eles vivem apenas para seus programas. Por que eles deveriam se preocupar
com as convenções sociais?"Eles estão vivos dentro do Tao."
2,4
Um noviço perguntou ao Mestre: "Aqui é um programador que nunca projeta,
documentos ou testes de seus programas. No entanto, todos que o conhecem o consideram um dos
os melhores programadores do mundo. Por que isso? "O mestre responde: "Isso programador dominou o Tao. Ele foi
além da necessidade para o projeto, ele não ficar com raiva quando o sistema
falhas, mas aceita o universo sem preocupação. Ele foi além do
necessidade de documentação, ele não se importa se alguém vê o seu código.
Ele foi além da necessidade de testes, cada um de seus programas são perfeitos
dentro de si, sereno e elegante, seu propósito auto-evidente. Na verdade,
ele entrou no mistério do Tao ".-------------------------
3 Livro - Design
Assim falou o mestre programador:
"Quando o programa está sendo testado, é tarde demais para fazer o projeto
mudanças. "3,1
Era uma vez um homem que foi para uma feira de negócios computador. Cada dia como ele
entrou, o homem disse ao guarda na porta:"Sou um grande ladrão, conhecido pelos meus feitos de furtos. Ser
prevenido, para esta feira não escapará unplundered. "Este discurso perturbado o guarda muito, porque havia milhões de
dólares de dentro do equipamento informático, assim que viu o homem com cuidado. Mas
o homem apenas vagava entre as cabinas, cantarolando baixinho.Quando o homem saiu, o guarda levou-o de lado e procurou suas roupas, mas
não havia nada a ser encontrado.No dia seguinte da feira, o homem voltou e repreendeu o guarda
dizendo: "Eu fugi com um vasto espólio de ontem, mas hoje será ainda
melhor. "Então o guarda observava-o cada vez mais perto, mas sem sucesso.No último dia da feira, o guarda pôde conter sua curiosidade
já não. "Ladrão de Sir", disse ele, "Estou tão perplexo, eu não posso viver em
paz. Por favor, me ilumine. O que é que você está roubando? "O homem sorriu. "Eu estou roubando idéias", disse ele.
3,2
Era uma vez um mestre programador que escreveu os programas não estruturados. A
programador iniciante, procurando imitá-lo, também começou a escrever
programas não-estruturados. Quando o noviço perguntou ao mestre para avaliar sua
progresso, o mestre o criticaram por escrever programas estruturados,
dizendo: "O que é apropriado para o mestre não é apropriado para o
novato. Você deve entender o Tao antes de transcender a estrutura. "3,3
Era uma vez um programador que foi anexado ao tribunal do senhor da guerra
de Wu. O senhor da guerra perguntou o programador: "Qual é mais fácil de desenhar: uma
pacote de contabilidade ou um sistema operacional? ""Um sistema operacional", respondeu o programador.
O senhor da guerra soltou uma exclamação de descrença. "Certamente uma contabilidade
pacote é trivial ao lado da complexidade de um sistema operacional ", ele
disse."Não é assim", disse o programador, "na concepção de um pacote de contabilidade,
o programador funciona como um mediador entre pessoas com diferentes
idéias: como deve funcionar, como os relatórios têm de aparecer, e como ele deve
em conformidade com as leis fiscais. Por contraste, um sistema operativo não está limitada
pelas aparências exteriores. Ao projetar um sistema operacional, o programador
busca a harmonia entre a máquina mais simples e idéias. É por isso que um
sistema operacional é mais fácil de desenhar. "O senhor da guerra de Wu assentiu com a cabeça e sorriu. "Isso tudo é bom e bem, mas
que é mais fácil de depurar? "O programador não respondeu.
3,4
A gerente foi para o programador mestre e mostrou-lhe os requisitos
documento para uma nova aplicação. O gerente perguntou ao mestre: "Quanto tempo
vai demorar para projetar esse sistema se eu atribuir cinco programadores para ele? ""Vai levar um ano", disse o mestre prontamente.
"Mas precisamos desse sistema imediatamente ou ainda mais cedo! Quanto tempo vai
tomar se eu atribuir dez programadores para ele? "O programador mestre franziu a testa. "Nesse caso, vai demorar dois anos."
"E se eu atribuir uma centena de programadores para ele?"
O programador mestre deu de ombros. "Então, o projeto nunca será
concluída ", disse ele.-------------------------
Livro 4 - Codificação
Assim falou o mestre programador:
"Um programa bem escrito é o seu próprio céu; um programa mal-escrito é
seu próprio inferno. "4,1
Um programa deve ser leve e ágil, seus sub-rotinas conectado como um
colar de pérolas. O espírito ea intenção do programa deve ser mantido
por toda parte. Não deve ser nem demasiado pouco ou demasiado, nem
laços desnecessários nem variáveis inúteis, nem falta de estrutura nem
rigidez esmagadora.Um programa deve seguir a Lei do Menor `Surpresa '. O que é essa lei?
É simplesmente que o programa deve sempre responder ao usuário na forma
que surpreende pelo menos ele.Um programa, não importa o quão complexo, deve agir como uma única unidade. O programa
deve ser dirigida pela lógica dentro e não pelas aparências exteriores.Se o programa falhar em estes requisitos, será em um estado de
desordem e confusão. A única maneira de corrigir isso é reescrever a
programa.4,2
Um noviço perguntou ao mestre: "Eu tenho um programa que é executado em algum momento e
às vezes aborta. Eu segui as regras de programação, mas eu sou
totalmente perplexo. Qual é a razão para isso? "O mestre respondeu: "Você está confuso porque você não entende Tao.
Somente um tolo espera comportamento racional de seus companheiros humanos. Por que você
espera de uma máquina que os seres humanos têm construído? Computadores simular
determinismo, apenas Tao é perfeito."As regras de programação são transitórios; Tao só é eterno. Portanto
você deve contemplar Tao antes de receber a iluminação. ""Mas como vou saber quando eu recebi a iluminação?", Perguntou o
novato."O programa irá funcionar corretamente", respondeu o mestre.
4,3
Um mestre estava explicando a natureza do Tao de um de seus noviços. "O
Tao está incorporada em todos os programas - independentemente de quão insignificante ", disse
o mestre."O Tao em uma calculadora de mão", perguntou o novato.
"É", veio a resposta.
"O Tao em um videogame?", Continuou o novato.
"É mesmo um jogo de vídeo", disse o mestre.
"E é o Tao do DOS para um computador pessoal?"
O mestre tossiu e mudou ligeiramente de posição. "A lição é sobre
para hoje ", disse ele.4,4
Programador Príncipe Wang foi a codificação de software. Seus dedos dançaram sobre a
teclado. O programa compilado sem uma mensagem de erro, eo programa
correu como um vento suave."Excelente!" O Príncipe exclamou: "Sua técnica é impecável!"
"Técnica?", Disse o programador voltando-se de seu terminal, "O que eu
seguir é o Tao - além de todas as técnicas! Quando comecei a programar eu
veria diante de mim todo o problema em uma única massa. Depois de três anos eu não
já vi essa massa. Em vez disso, eu usei sub-rotinas. Mas agora não vejo nada.
Todo o meu ser existe um vazio sem forma. Meus sentidos estão ociosos. Meu espírito,
livre para trabalhar sem plano, segue o seu próprio instinto. Em suma, meu programa
escreve-se. É verdade que às vezes há problemas difíceis. Vejo-os
vindo, eu abrandar, eu assisto em silêncio. Então eu mudar uma única linha de código
e as dificuldades desaparecem como baforadas de fumaça ocioso. Eu então compilar o
programa. Sento-me quieto e deixar que a alegria do trabalho encher meu ser. Eu fechar meu
olhos por um momento e faça logoff. "Príncipe Wang disse: "Será que todos os meus programadores eram tão sábio!"
-------------------------
Livro 5 - Manutenção
Assim falou o mestre programador:
"Apesar de ser um programa, mas três linhas, algum dia terá de ser
mantida. "5,1
Uma porta bem usado não precisa de óleo nas dobradiças.
Um fluxo rápido de fluxo não cresce estagnada.
Som nem pensamentos podem viajar através do vácuo.
Software apodrece se não for usado.Estes são grandes mistérios.
5,2
A gerente pediu um programador quanto tempo levaria para concluir a
programa em que ele estava trabalhando. "Ela será concluída amanhã," o
programador respondeu prontamente."Eu acho que você está sendo irrealista", disse o gerente, "Na verdade, como
tempo vai demorar? "O programador pensou por um momento. "Eu tenho algumas características que eu gostaria de
adicionar. Isso vai demorar pelo menos duas semanas ", ele disse finalmente."Mesmo que seja demais esperar", insistiu o gerente, "Eu estarei
satisfeito se você simplesmente me dizer quando o programa é completo. "O programador concordou com isso.
Vários anos depois, o gerente aposentado. No caminho para sua aposentadoria
almoço, ele descobriu o programador adormecido em seu terminal. Ele tinha sido
programação durante toda a noite.5,3
Um programador novato já foi atribuído o código de um simples pacote financeiro.
O noviço trabalharam arduamente durante muitos dias, mas quando seu mestre Comentários
seu programa, ele descobriu que ele continha um editor de tela, um conjunto de
generalizada gráficos rotinas, uma interface de inteligência artificial, mas
não menor menção de qualquer coisa financeiro.Quando o mestre perguntou sobre isso, o novato ficou indignado. "Não seja
tão impaciente ", disse ele," eu vou colocar na forma financeira, eventualmente. "5,4
Será um bom agricultor negligenciar uma cultura que plantou?
Será que um bom professor ignorar, mesmo o aluno mais humilde?
Será um bom pai permitir que uma única criança a morrer de fome?
Será que um bom programador se recusar a manter o seu código?-------------------------
Livro 6 - Gestão
Assim falou o mestre programador:
"Que os programadores são muitos e os poucos gerentes -, então tudo será
produtivo. "6,1
Quando os gerentes de reuniões intermináveis, os programadores a escrever jogos. Quando
contadores falar dos lucros trimestrais, o orçamento de desenvolvimento está prestes a
ser cortado. Quando os cientistas seniores falar céu azul, as nuvens estão prestes a rolar
polNa verdade, este não é o Tao da Programação.
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. Ele
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
não. 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. No
change in management can harm him. He will not be fired, even if the
project is cancelled. Por que isso? 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
la. 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.
assim
$ 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"



































