Friday, February 27, 2009

Ahh...Serra da Estrela, aqui vamos nós

Ahh...Serra da Estrela, aqui vamos nós!

Bem sei que é altamente provável que apanhe desagradáveis poças de água lamacentas e escurecidas pela fusão de terra e neve derretida mas...a casa já está alugada e agora é tarde de mais para voltar atrás! ;o)

Hoje à noite iremos sair para lá e só voltamos no domingo (que já estou a controlar para nos deslocarmos a MAIS uma ida ao Gokobe ;o))

Por falar em Gokobe, na quarta feira passada experimentei almoçar lá pela primeira vez! Durante o almoço, embora custe menos 5 euros (€10.90 em comparação com os €15.90 do jantar), a coisa funciona como buffet pelo que não contem comer propriamente O QUE QUEREM mas sim o que vos disponibilizam!

Ah...já agora, o restaurante está aberto 7 dias por semana!

Por um lado fiquei agradado porque NUNCA deixaram de ter lá sushi (sempre que as travessas esgotavam eles punham novas) mas, por outro, gosto mais do luxo de não ter de me levantar e poder escolher exactamente o que quero! ;o)

Ah...e por falar em escapadelas, 28 de Março partimos para Cuba (mais exactamente, Varadero)!

Nirvana - You Know You're Right (In Reverse)

E pronto, tinha de acontecer, as teorias da conspiração sobre mensagens subliminares embutidas em discursos ou músicas tinha de chegar à "You know you're right" dos Nirvana.

Embora seja, obviamente, da opinião que é uma enorme coincidência, é de facto curioso como algumas frases poderão fazer algum sentido (e, de várias gravações em reverse que ouvi, está é a que tem as palavras mais perceptíveis).



Como não podia deixar de ser, fiz reverse à música eu próprio para verificar que não tinha havido adulteração e, de facto, o que se ouve está em reverse :o)

Enjoy!

Tuesday, February 24, 2009

Chegado de Lisboa!

Ahhh...finalmente! :o)

Tive de ir para Lisboa, um pouco de urgência, para fazer uma auditoria de segurança.

Quem me conhece já sabe bem: não nutro muitos amores pela nossa Capital (chamem-me bairrista ou o caraças...mas há lá qualquer coisa que não gosto).

Como as reuniões começavam às 9h da matina, lá tive de ir no Domingo ao final da tarde (com um grupo de mais 3 porreiraços cá do Porto).

A viagem até passou bem (há sempre que falar numa viagem de 2.5 a 3 horas com várias pessoas num carro) mas...a noite no Hotel foi do PIOR!

Raios para aquele quarto, estava estupidamente QUENTE e o ar condicionado não parecia fazer nada!

Acabei por me deitar às 2h30 e acordar às 6h20 (grrrr)!

Quando terminamos os afazeres pus-me logo a andar para a Gare do Oriente (o meu Alfa era só às 19h09 mas consegui [felizmente] pisgar-me antes e apanhar o das 6h09! hi hi hi).

Não costumo fazer muitas viagens de Alfa (embora, no total, já tenha feito algumas...) mas a maior parte delas foram sempre em turística já que achava que a diferença dos 12 euros não justificava o upgrade para a "classe" conforto.

Pois bem, tenho agora que admitir que estava enganado. Embora eu tenha quase a certeza que já fiz outras em classe "Conforto", não me recordava que ofereciam o jornal / revistas e uma bebida (e entrada para petiscar) de oferta. Isto já para não falar nas óbvias tomadas eléctricas as quais, na minha opinião, deveriam estar espalhadas por TODO o comboio!

Mas adiante (que isto é tudo conversa da treta), com bastante tempo nas mãos, tive oportunidade de experimentar mais algumas aplicações e jogos para o iPhone (bendito brinquedinho!).

Escusado será dizer que o tráfego voou nestes 2 dias mas ao menos já tenho aqui uns jogos porreiros para passar o tempo!

Ora aqui ficam as minhas sugestões (por ordem decrescente de agrado):
1- Tower
2- Magnetic Joe
3- Labyrinth Lite
4- SmartSoko
5- Archibald's Adventure
6- Pole Position (o remake de um clássico)
7- FastLane Lite (bons gráficos mas difícil de controlar)

Infelizmente, cada vez mais enjoo ao ser transportado (especialmente se estiver a ler algo ou atento a algo pseudo estático)...

Sai do comboio bastante enjoado...acho que vai ser a última vez que vou de Comboio em situações que posso levar o meu próprio carro! :o|

Friday, February 20, 2009

HPC 2008: The cake is a lie!


Bem, não é que esteja a usar a frase no seu sentido mais clássico mas acho que é algo apropriada ao que acabei de passar com MAIS uma experiência a programar com APIs da Microsoft!

Estou a trabalhar num projecto com o Microsoft Windows HPC 2008 (aliás, já o estou há quase 2 anos) e surgiu a necessidade de controlar jobs submetidos directamente pelo HPC Job Manager, pela command prompt ou até programaticamente.

Ora, se controlar jobs que nós mesmos criamos é relativamente fácil, a coisa complica-se aqui! :o)

A solução inicial passou por definir um ActivationFilterProgram através do cluscfg.

Embora isto dê muito jeito para evitar que os jobs submetidos directamente ao Windows fossem executados de imediato pelo scheduler da Microsoft, não me resolvia o outro problema: como mudar parametros de jobs que não me pertencem?!

Ora a solução foi também relativamente simples: ISchedulerJob.CloneJob()!

A ideia era clonar um job sempre que este fosse directamente submetido (sem passar pela minha aplicação) de forma a poder controlar todos os seus aspectos quando precisasse.

O problema é que hoje descobri que isto também não é solução já que o ISchedulerJob.CloneJob() só funciona SE o utilizador que está a chamar este método for o Owner do job a clonar!

Azar do caraças...de volta ao quadro de sketches! ;o)

A solução final parecia também ser relativamente simples: fazer um método CloneJob() que criasse um novo job e copiasse todos os atributos do job original!

É claro que isto funciou às mil maravilhas! Até chegar à altura de executar o job clonado... :o)

A principio pensei que fosse apenas uma confirmação que o ser humano ainda não controla por completo o milagre da vida e o cloning é algo que deve apenas ser deixado para Deus! Mas não...afinal o problema era bastante mais bizarro :o)

Os jobs clonados falhavam com uma razão mais ao menos como esta: "Failed Task jobID.TaskID: task exit with exit code 0".

Ora, coisa estranha esta hein? E eu que sempre pensei que uma aplicação, método ou função que retorne 0 signfica que tudo correu bem? :o)

Parece que, mais uma vez, a Microsoft quer redefinir o que já está definido (por eles mesmo)!

Não há crise nenhuma, é só uma questão de verificar tudo de novo até funcionar, correcto?

Certo! E de acordo com a documentação da Microsoft, o método ISchedulerJob.CloneJob() deles copia nada mais que 52 atributos (ou serão 51 e eu contei mal)?

É claro que, para ajudar, a documentação tinha de estar desactualizada, algumas das variáveis não existirem (ou serem privadas) e terem os nomes desactualizados :o)

Isso também não foi desmotivador o suficiente para mim que testei esses 52 atributos, um a um, até perceber o que estava a acontecer para o job clonado falhar.

Depois de verificar que TODOS os atributos eram copiados exactamente com o mesmo valor, foi preciso continuar com a análise empírica para tentar perceber qual dos valores estava a dar asneira.

Nada mais simples: comenta, recompila, reinstala e testa! (isto para cada um dos atributos)

Cheguei a um ponto onde FINALMENTE descobri o que estava a causar este estranho problema (afinal não eram os meus fracos dotes na área da genética)!

Ora, as Tasks podem especificar quais os ficheiros para usar como stdout, stdin e stderr e o problema estava exactamente aqui!

Não é que o bixo, embora quando se crie um job as propriedades stdoutFilePath, stdinFilePath e stderrFilePath sejam TODAS "" por definição, o gajo dá asneira se atribuirmos o valor ""? :o)

Ou seja, o código que estava a meter nojo era:
clonedTask.stdinFilePath = originalTask.stdinFilePath;
clonedTask.stdoutFilePath = originalTask.stdoutFilePath;
clonedTask.stderrFilePath = originalTask.stderrFilePath;

Embora todas estas propriedades sejam inicializadas durante a criação do job com "", se tentarmos atribuir-lhes QUALQUER valor (ie: ""), o sacana do Scheduler assume que estamos a pedir para usar um ficheiro stdout / stdin / stderr na path "".

Para concluir, a solução para TODO este trabalho foi deveras simples:
if (!originalTask.stdinFilePath.equals(""))
clonedTask.stdinFilePath = originalTask.stdinFilePath;
if (!originalTask.stdoutFilePath.equals(""))
clonedTask.stdoutFilePath = originalTask.stdoutFilePath;
if (!originalTask.stderrFilePath.equals(""))
clonedTask.stderrFilePath = originalTask.stderrFilePath;

Isto tudo para concluir a frase inicial do título deste post: The cake is a lie!

NUNCA confiem na documentação e APIs da Microsoft :o)

Os jogos custam demasiado...ou não?


Já escrevi uma vez sobre isso algures e a minha opinião é que PARA o nosso poder de compra (em Portugal), sim, custam muito!

Mas, por outro lado, os jogos "sempre" custaram o que custam agora (quem não se lembra quanto custavam os jogos originais para a Mega Drive, Nintendo ou Super Nintendo? Ou até o grande Virtua Racing que custava uns meros 20 contos (100 euros para quem esqueceu o valor da "moeda" antiga)).

Sabendo que os valores se "mantiveram" embora os salários tenham subido (bem como o custo de tudo o resto) e sabendo que hoje em dia é bastante mais caro criar um video jogo de qualidade (com altas bandas sonoras e sequências cinematográficas), acho que os jovens adultos estão é mal habituados já que há 15 a 20 anos atrás quem lhes comprava os jogos eram os paizinhos ;o).

Não obstante, acabei de ver uma notícia no Slashdot que reflecte exactamente esta velha pergunta: Os jogos custam demasiado...ou não?

"Valve's Gabe Newell gave the keynote address at this year's Design, Innovate, Communicate, Entertain (DICE) Summit about the cost of games, the effect of piracy, and how to reach new players. Valve undertook an experiment recently to test how price affected the sales of their popular survival-horror FPS, Left 4 Dead. They Reduced the price by 50% on Steam, which "resulted in a 3000% increase in sales of the game, posting overall sales that beat the title's original launch performance." They also tested various other price drops over the holidays, seeing spikes in sales that corresponded well to the size of the discount. This will undoubtedly add to the speculation that game prices have risen too high for the current economic climate. G4TV ran a live blog of Newell's presentation, providing a few more details."

Bastante interessante! Isto demonstra claramente que uma redução no preço iria melhorar as vendas (e, como sabemos, diminuir a pirataria)!

Afinal, quem prefere ter uma cópia quando pode ter um original todo bonito (com uma capa e documentação a rigor)? ;o)

Como instalar um corrector ortográfico pt_PT no Zimbra

O Zimbra é, sem qualquer dúvida, uma solução excelente para PMEs que necessitem de uma suite completa de colaboração e uma excelente alternativa ao Microsoft Exchange.

É muito fácil de instalar e o interface web de gestão permite que até um macaco consiga administrar um servidor de email completo!

Um dos problemas que detectamos nas nossas experiências com esta plataforma é que ela não tem um corrector ortográfico em condições (e os clientes apenas trazem um corrector en_EN)!

Como resolver isto então?

Simples! Para os clientes desktop basta copiar os ficheiros dos dicionários PT do myspell para o directório "zdesktop\win32\prism\xulrunner\dictionaries" dentro do directório onde o Zimbra foi instalado (ie: "C:\Documents and Settings\User\Local Settings\Application Data\Zimbra\zdesktop\win32\prism\xulrunner\dictionaries") e apagar os que já lá estão se não quiserem o dicionário inglês.

Para arranjar os dicionários PT myspell fui a uma máquina minha com Ubuntu, instalei o pacote "myspell-pt-pt" (apt-get install myspell-pt-pt) e copiei os ficheiros "pt*" do directório "/usr/share/myspell/dicts/".

root@pvr:~# ls /usr/share/myspell/dicts/
DicOOo.sxw pt.aff pt_PT.aff pt_PT.dic
dictionary.lst pt.dic pt-PT.aff pt-PT.dic
root@pvr:~#

Para o servidor web, é necessário fazer o download e instalação dos dicionários PT para o aspell, acrescentar a localização do aspell à nossa PATH (ie: export PATH=$PATH:/opt/zimbra/aspell-0.60.6/bin), ./configure && make && make install (no directório onde estão os dicionários PT descomprimidos) e mudar a variável $locale do ficheiro "/opt/zimbra/httpd/htdocs/aspell.php" para apontar para "pt_PT" em vez de "en_EN".

No final, basta reiniciar o serviço zmspell:
zmspellctl stop ; zmspellctl start

Quem quiser mais informações pode ler a coisa aqui!

Com que então queres mudar o estado de Nós computacionais programaticamente, hein?


Ah, ah! Finalmente tenho a solução para algo que necessitava fazer: mudar o estado de nós computacionais no Microsoft Windows HPC2008...programaticamente!

Quem usa (ou TEM de usar :oP) o HPC2008, já deve ter reparado que ao instalarmos um nó computacional extra, SE este não for instalado via RIS, fica num estado "unknown" após a instalação do HPC Pack no nó computacional.

Ora, a solução é, tipicamente, ir ao Microsoft HPC Manager e adicionar o nó pelo GUI.

Com a ajuda dos nossos amigos peludos da Microsoft descobri que é possível fazer isto através de powershell com os comandos: Get-HPCNode e Assign-HpcNodeTemplate.

Ou seja, queremos listar todos os nós computacionais num determinado estado (ie: Unknown) e fazer um pipe para o comando "Assign-HpcNodeTemplate" de forma a atribuir um Template ao nó. É claro que uma técnica semelhante pode ser utilizada para mudar os nós entre estados através de um pipe do comando Get-HPCNode para o comando Set-HpcNodeState.

Isto já ajudava bastante mas, o bolo no topo da cereja (sim! Eu gosto mais de bolos que cerejas ;o)) é fazer isto programaticamente via .NET!

Deixo-vos aqui então o exemplo de como executar um comando PowerShell programaticamente e fazer um pipe deste para outro!

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Management.Automation;
using System.Management.Automation.Runspaces;
using System.Collections.ObjectModel;
namespace MyHPC
{
class Program
{
static void RunScript()
{
RunspaceConfiguration rc = RunspaceConfiguration.Create();
PSSnapInException snapEx = null;
PSSnapInInfo info = rc.AddPSSnapIn("Microsoft.HPC", out snapEx);
Runspace runspace = RunspaceFactory.CreateRunspace(rc);
// open it
runspace.Open();
Pipeline pipeline = runspace.CreatePipeline();
pipeline.Commands.Add("Get-HPCNode");
pipeline.Commands[0].Parameters.Add("State", "Unknown"); // I am assuming Offline is an enum
pipeline.Commands.Add("Assign-HpcNodeTemplate");
pipeline.Commands[1].Parameters.Add("Name", @"Default ComputeNode Template");
pipeline.Commands[1].Parameters.Add("Confirm", false);
pipeline.Commands.Add("Out-String");
Collection<PSObject> results = pipeline.Invoke();
// convert the script result into a single string
StringBuilder stringBuilder = new StringBuilder();
foreach (PSObject obj in results)
{
stringBuilder.AppendLine(obj.ToString());
}
Console.WriteLine(stringBuilder.ToString());
runspace.Close();
}
static void Main(string[] args)
{
RunScript();
}
}
}
Enjoy! ;o)

Wednesday, February 18, 2009

Ah Gokobe que ganhaste um grande cliente...

E pronto, desde que vim dos Estados Unidos que ando viciado em Sushi!

Por lá, arranjamos um espectacular "All you can eat" por 12 dollars. Por cá, novamente pela boca e teclas dos amigos Carlos Martins e o Bruno (qual quer que seja o seu segundo nome!), descobrimos o Gokobe.

Agora que penso no assunto, já tinha passado várias vezes por lá mas como já sei que o suhi é, geralmente, extremamente caro cá pelo Porto, nunca tinha entrado!

Afinal, o menu "all you can eat" ronda os 15.90 euros (durante os jantares, embora seja mais barato durante o almoço).

Ora, não é que a minha nutricionista me disse que posso fazer duas refeições de Sushi por semana? Está tudo lixado! :oP


Ainda na sexta tinha estado lá e hoje já lá voltamos (incrementando para 4 as nossas visitas ao restaurante)!

*Burp*...

Aquela treta é mesmo boa! Aconselho-vos a darem lá uma saltada ;o)

Aplicações porreiras para o iPhone


Ah ah! Pois eu bem tentei escrever sobre isto hoje de manhã mas graças aos timeouts do PhpMyAdmin perdi o meu EXCELENTE post sobre as aplicações mais porreiras para o iPhone! ;o)

Como é, possivelmente, óbvio, acabei por comprar um no sábado passado!

O amigo Carlos Martins lá me chateou tanto que eu não pude resistir (vejam lá que o gajo é tão chato que foi preciso mostrar-me o telefone em funcionamento para me convencer)! :oP

Sem mais demoras, aqui ficam as melhores apps que descobri (muitas delas com a ajuda do Carlos Martins):
- RulerPhone, utiliza a camera do telefone como uma fita métrica (esta aplicação permite que se meçam objectos em fotografias);
- Google Earth, nem vou gastar tempo a explicar :o)
- Free RSS, um leitor de RSS porreiro;
- Run Keeper, uma aplicação que permite fazer estatísticas de tempo e registar os sítios por onde passamos (útil para quem gosta de dar umas corridas);
- Midomi, uma aplicação para detectar AQUELA música (faz reconhecimento de áudio);
- Vnc Lite e RDP Lite, clientes de VNC e Remote Desktop;
- TouchTerm, um cliente SSH muito merdoso (não é mínimamente utilizável mas achei por bem referi-lo);
- Vlingo, uma aplicação "voice to text", permite pesquisar e comandar o telemóvel através de voz! Os resultados são impressionantes e, ao contrário de outras frameworks (como as incluídas no passado com o Microsoft Windows, nem sequer é preciso treinar o telemóvel). O motor faz uma detecção MUITO boa!
- Shazam, mais outra aplicação de reconhecimento áudio;
- Google Apps, uma aplicação com links directos para as várias apps do google;
- Banca Sapo, para ver as últimas notícias e capas dos jornais e revistas;
- Handshake, para partilhar contactos e imagens entre iPhones;
- Funambol, aplicação para sincronizar os dados do telemóvel com um host remoto (se bem compreendi, é possível instalar o serviço numa máquina nossa!). Também faz sincronização com Outlook e outras aplicações através de plugins! (fiquei surpreso que até as photos dos meus contactos ele processou);
- Wikitap, uma aplicação muito boa que funciona de interface para a Wikipedia;
- Wikiamo, outro interface para a wikipedia mas...mais fraco! Incluo aqui porque, por alguma razão o deixei no meu telemóvel! Acho que tinha qualquer feature extra que o Wikitap não tinha... (talvez seja o abanar o telemóvel para mudar entre artigos? Uma paneleirice inútil :oP);
- Koredoko, esta aplicação permite visualizar a informação sobre ONDE foram tiradas as fotografias que registaram o sítio...onde foram tiradas :oP
- Wifi Discover, um servidor web que permite que outros equipamentos na rede possam enviar e receber ficheiros;
- IM+ Lite, um cliente de Jabber (e de outros protocolos) muito porreiro!
- Wi-Fi Finder, uma aplicação que permite pesquisar pontos de acesso wifi gratuitos perto de nós! Fiquei surpreso com a quantidade de APs livres que existe em Gaia e Porto!
- ISniper Lite, um joguito (que não é nada de mais mas que mostra algumas capacidades do iPhone). Neste jogo controlamos a mira de um sniper abanando o telemóvel e disparamos carregando no ecrã!

E pronto, aqui fica a minha lista de algumas aplicações que valem a pena :o)

A instalação destas aplicações é incrivelmente fácil! Existe uma aplicação "App Store" que serve de interface com o repositório da Apple pelo que, para aplicações gratuitas, é só meia dúzia de clicks e aplicação é descarregada e instalada directamente para o telemóvel!

Quanto ao resto, é certo que o iPhone não faz video chamadas e não suporta MMS (oh k, a Vodafone já tem uma aplicação que permite o envio de MMS) mas...há quem use MMS e vídeo chamadas?!

Infelizmente, o preço destes serviços é tão caro (e ainda existem "poucos" com telemóveis que os suportem)...de que raio me serve? :o\

Eu queria era tarifários ainda melhores! Acho que 1Gb de tráfego no iPhone seria MAIS que suficiente para um uso intensivo (desde que não se ponham a ver montes de filmes no youtube :oP).

O Copy/Paste já me chateou um pouco (porque precisei de mandar um contacto por sms e não há nenhuma opção para o fazer) mas...um gajo esquece-se disso porque o interface com o utilizador é simplesmente excelente! Muito bem conseguido, sem dúvida alguma.

O cliente de email que vem com o bixo também é porreirito, só é pena é que não dá para fazer pesquisas e anexar imagens / ficheiros durante a escrita das mensagens (podemos é abrir uma photo e criar um novo email...).

São algumas coisinhas chatas mas que, se a Apple as corrigir com novos firmwares, poderão tornar este telemóvel o melhor do mercado (para toda a gente)!

Para já, este é o melhor para mim... :o)

Vamos ver quanto tempo continuarei eu satisfeito com ele ;o)

First post

Pronto, lá me portei do meu código PHP manhoso feito nos tempos livres para o Blogger.

O meu site antigo (http://lms.ispgaya.pt) continua em pé (embora seja altamente provável que o vá mudar de domínio mais tarde ou mais cedo)!

A partir de agora, o "My GPS lost itself" passa a ser o sítio onde escrevo as minhas parvoíces :o)