sexta-feira, junho 08, 2012

Botanical Dice Set from Shapeways in Gold Plated Glossy

New addition to the family - to accompany the Thorn Dice Set, the three currently available dice of the Botanical Set; this time, upgraded from bronze to gold.

Those are designed by Chuck Stover too and look amazing. You get sort of an elvish feeling, so they might be perfect in a forest-oriented adventure - can't wait 'till the rest of the set is ready. Below, pictures.

Also, if you are into massive multiplayer games, you might enjoy this browser-based one. It is quite fun - just send me a message ingame if you want any tips (:

The set:


D4:
 D8:
D12:

terça-feira, julho 26, 2011

Thorn Dice Set from Shapeways in Antique Bronze Glossy

Shapeways is quite an incredible company: you design something in 3D (or have someone else design it for you) and they... print it. Literally, with a printer. In plastic. In stainless steel. In silver, and more. And you can also have it infused with bronze or gold - yes, really awesome.

Below are some pictures of my recently-acquired Thorn Dice Set, by Chuck Stover. The set is made in stainless steel, with the "Antique Bronze Glossy" cover: do notice that, while the polishment works on the edges, most of the dice is not reachable so they should look a lot like the "Antique Bronze Matte" ones.

Also, if you are into massive multiplayer games, you might enjoy this browser-based one. It is quite fun - just send me a message ingame if you want any tips (:

(by the way, did you realize its quite difficult to take good macro shots with a point-and-shoot camera?!?)

The set:



D4:


D6:


D8:


D10:


D12:


D20:


D100 (it's a D10 with different numbers):


The picture of the set in the store page is in stainless steel. You can find them in stainless steel (left) and silver (right) here. You can find pictures of many materials, including plastic and gold, on The Dice Collector (scroll down to the "Thorn" part).

By the way, be sure to check the other dice sets available on Shapeways - there are a lot of good 3D artists out there making a lot of nice things. The Steampunk dice seem particularly nice...

A note about packaging:

One word: overkill. Honestly, there were only 7 dice, that should weight about 200g or something like that. They sent a huge box filled with those anti-chock "s" things (for the lack of a better word to describe it)... well, at least you know what you buy won't be damaged! (:

A note to buyers in Brazil:

A Shapeways também envia para o Brasil através da UPS: isso significa que eles chegam extremamente rápido, nada como compras na DealExtreme. Impressões em plástico levam cerca de 10 dias e em metal cerca de 14 dias úteis para serem finalizadas; após o envio, demoraram somente 3 dias úteis para chegar na minha casa (mais o final de semana).

Isso significa, entretanto, que o imposto será obrigatoriamente cobrado: a UPS faz o pagamento por você e deixa junto com o pacote um boleto de cobrança. E muito imposto! Ao total, deram cerca de 113% - incluíndo-se aí o II (Imposto sobre Importação), ICMS (que, absurdamente, é cobrado sobre o valor original convertido mais o II), algumas "taxas administrativas" e até uma taxa para a Infraero. Quer algo legal que não é feito no Brasil? Prepare o bolso!

tl;dr: If you buy them in Brazil, you'll pay an extra 113% in taxes. FML.


quinta-feira, junho 30, 2011

How to build Polarion's SVNWebClient from source

If you ever tried to build a project from source, you are aware it's not usually the easiest thing - so here are a few notes on how to build SVNWebClient:

  • The SVN repository for the project is located here. You'll need a Polarion or Polarion Community account - you can get one (for free) here.
  • Download only the trunk from the repository.
  • You need two source folders on your build path: src/java and src/contrib/standalone. You can safely remove src/contrib/polarion since it's related to other Polarion products. You can also safely remove plugin.xml if you don't want to be bothered by the errors showing on your IDE.
  • You still need some .jar files that are not on their SVN repository. You can find them insite svnwebclient.war, in the WEB-INF/lib folder. Just add them to your build path: svncommons.jar, log4j-1.2.8.jar, ganymed.jar, backport-util-concurrent.jar. You can download the .war here - you'll need your Polarion Community account again. Just open it with WinRAR or a similar, extract and add to your build path.
  • At least on my build (today), the svnkit.jar included on the war above didn't work. I had to download the standalone version of SVNKit 1.3.5.7406 from here just to get it and add it to the classpath.

There you go! Now build with Maven and you're all set!

quarta-feira, junho 22, 2011

Como configurar o Eset Smart Security (ESS) com o Wild Media Server (WMS), servidor DLNA

O setup:
- TV Samsung série C5000 (Full HD), conectada à rede via cabo CAT5e (100Mbps)
- Roteador TP-Link TL-WR941N (com firmware padrão, não o dd-wrt)
- Notebook rodando Wild Media Server v1.08.2, conectado à rede via 802.11n (300Mbps)

O Problema:
  A televisão não "enxergava" o servidor DLNA. Com o firewall do ESS desativado, tudo funcionava normalmente... mas ao ativá-lo, mesmo no "learning mode", a conexão era perdida.

A solução:
  O ESS é um pouco... "precavido" demais, mesmo na zona confiável e com compartilhamento ativado. As seguintes alterações resolvem:
  •   Criar uma regra para o arquivo wms_.exe liberando conexões TCP/UDP para os endereços abaixo. Eu liberei para todas as portas para não me preocupar com conexões de entrada/saída:
    • Sub-rede 192.168.X.0, máscara 255.255.255.0 (ou qualquer que seja sua Zona Confiável) na porta configurada no seu WMS.
    • IP de broadcast do DLNA, 239.255.255.250, portas 1900 e 5000.
  • Nas configurações avançadas do firewall,  vá até Opções avançadas e IDS e marque Permitir UPNP na Zona Confiável.
Essas regras já deixarão a conexão ser feita. No meu caso, após algum tempo reproduzindo conteúdo ou muita navegação nos menus, a conexão era bloqueada pelo IDS (Intrusion Detection System) por causa de um TCP Flooding Attack proveniente do IP da televisão. Você pode desativar esta opção do IDS globalmente, o que não é recomendável, ou...
  • Vá até as Configurações de Regras e Zonas > Zonas, e adicione os seguintes IPs à lista Zona Excluída da Proteção Ativa (IDS):
    • Sub-rede 192.168.X.0, máscara 255.255.255.0 (ou qualquer que seja sua Zona Confiável)
    • IP de broadcast do DLNA, 239.255.255.250

Et voilà!

sexta-feira, janeiro 01, 2010

Review: The Invention of Lying [2009]




Partindo de uma premissa inexperada - a mentira é algo desconhecido, e todos falam somente a verdade - temos um filme que, apesar de simples à primeira vista, nos leva a algumas divagações quando começamos a pensar o que faríamos no lugar do personagem principal Ricky (interpretado por Mark Bellison). O elenco conta também com Jennifer Garner (dos filmes "Daredevil", "Elektra" e "Juno" e da série "Alias" ) e, apesar da atuação às vezes mediana e pouco convincente dos atores, conta com ótimos momentos.

Com cenas inesperadas - geralmente ocasionadas pelo simples fato de todos falarem o que pensam, "Seu bebê é tão feio, parece um rato!" - é um filme descompromissado ótimo para ser assistido acompanhado e garante boas risadas com detalhes simples desde o nome do motel do início do filme ("Motel Barato Para Sexo Com Estranhos") até a criação das igrejas ("Um Lugar Tranqüilo Para Se Pensar No Homem No Céu").

Em DVD: ?
Release para assistir: The.Invention.of.Lying.2009.MERRY.XMAS.BDRip.XviD-iMBT
Links: IMDB (6.6, 6.870 votos) | Rotten Tomatoes (57%)

sábado, novembro 29, 2008

Como evitar o submit de um Form com a tecla Enter?

Cena comum na web: usuário está preenchendo um campo input do tipo texto, e o usuário aperta enter - provavelmente esperando mudar de campo, acaba enviando o formulário.

Caso a aplicação seja bem feita uma validação ocorrerá e nenhum dado preenchido será perdido, apenas mostrando uma mensagem de erro na tela. Infelizmente, esse não é o caso na maior parte dos sites por aí... geralmente ou o formulário é submetido incompleto mesmo ou a tela sofre um reload e todos os campos se apagam.

Felizmente, evitar a ação da tecla <enter> em um campo é extremamente simples, bastando criá-lo com o seguinte código:


<input type="text" width="50px" name="name" id="id"
onKeyPress="return !(event.keyCode==13);" />


Definindo a ação onKeyPress do campo, a cada tecla digitada será verificado por javascript se a tecla foi a (keyCode = 13) - caso seja será retornado false, evitando a ação da tecla.

quinta-feira, novembro 27, 2008

Arquivo de build ANT genérico

Segue um arquivo ANT para build automatizado que fiz para um trabalho na faculdade. Serve para projetos simples, onde o código fonte fica na pasta /src, as libs em /lib. Será criado um .zip com os arquivos .jar do programa, das libs, e do código fonte na pasta do projeto. Arquivos criados temporariamente são apagados.
Basta criar um arquivo build.xml na raiz do projeto, e definir algumas variáveis no arquivo antes de executar.

Observação: apesar de uma parte do código não aparecer por causa do layout, basta selecionar tudo que a cópia sairá correta.


<?xml version="1.0" encoding="iso-8859-1" ?>
<project name="build" default="zip" basedir=".">

<!-- xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx -->
<!-- nome do programa -->
<property name="app.name" value="scheduler" />
<!-- classe principal do programa -->

<property name="main.class" value="br.ufsc.ine5616.scheduler.MainScheduler" />
<!-- classpath: definir todas as libs, pois o JRE não aceita wildcards -->
<property name="classpath" value="lib/forms-1.2.1.jar lib/looks-2.2.1.jar" />

<!-- xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx -->



<!-- diretorio de fontes -->
<property name="src" value="${basedir}/src" />
<!-- diretorio de libs -->

<property name="lib" value="${basedir}/lib" />

<!-- diretorios temporarios -->
<property name="build" value="${basedir}/classes" />

<property name="jar" value="${basedir}/jar" />
<property name="dist" value="${basedir}/dist" />


<tstamp>
<format property="timestamp" pattern="dd-MMM-yyyy HH:mm:ss" />
</tstamp>

<target name="create" description="Creates output folders">

<echo>[${app.name}] Create</echo>
<mkdir dir="${build}" />
<mkdir dir="${jar}" />

<mkdir dir="${dist}" />
</target>

<target name="compile" depends="create" description="Compiles the source">

<echo>[${app.name}] Compile</echo>
<javac srcdir="${src}" destdir="${build}" >
<classpath>

<fileset dir="${lib}">
<include name="**/*.jar" />
</fileset>
</classpath>
</javac>

</target>

<target name="jar" depends="compile" description="Creates the jar">
<echo>[${app.name}] Jar</echo>

<jar destfile="${jar}/${app.name}.jar" basedir="${build}">
<manifest>
<attribute name="Implementation-Title" value="${app.name}"/>

<attribute name="Main-Class" value="${main.class}"/>
<attribute name="Sealed" value="true"/>
<attribute name="Class-Path" value="${classpath}"/>

<attribute name="Created-On" value="${timestamp}"/>
<attribute name="Created-By" value="${user.name}"/>
</manifest>

</jar>
</target>

<target name="deploy" depends="jar" description="Deploys projects and /lib to /dist">
<echo>[${app.name}] deploy</echo>

<copy todir="${dist}/${app.name}" overwrite="yes">
<fileset dir="${jar}" includes="${app.name}.jar"/>

</copy>
<copy todir="${dist}/${app.name}/lib" overwrite="yes">
<fileset dir="${basedir}/lib" includes="*.jar" />

</copy>
</target>

<target name="deploy-src" description="Deploys the source files to a .jar file">
<echo>[${app.name}] deploy - src</echo>

<jar destfile="${jar}/${app.name}-src.jar" basedir="${src}">
<manifest>
<attribute name="Implementation-Title" value="${app.name}"/>

<attribute name="Created-On" value="${timestamp}"/>
<attribute name="Created-By" value="${user.name}"/>
</manifest>

</jar>
<copy todir="${dist}/${app.name}" overwrite="yes">
<fileset dir="${jar}" includes="${app.name}-src.jar"/>

</copy>
</target>

<target name="zip" depends="deploy, deploy-src" description="Creates a .zip with the app">
<echo>[${app.name}] Zip</echo>

<delete file="${app.name}.zip" />
<zip destfile="${app.name}.zip" basedir="${dist}" update="true" />

<ant antfile="${basedir}/build.xml" target="clean" />
</target>

<target name="clean" description="Cleans the output directories">

<echo>[${app.name}] Clean</echo>
<delete dir="${build}" />
<delete dir="${jar}" />

<delete dir="${dist}" />
</target>

</project>

segunda-feira, novembro 10, 2008

Atualização

A Lib Utils foi atualizada para a versão 1.1 - agora contém a classe ExternalIPFinder, que permite descobrir o endereço IP externo do computador através do serviço de automação do site www.whatismyip.com.

sábado, setembro 13, 2008

LHC?!?

Como programadores matam dragões

Java
Chega, encontra o dragão. Desenvolve um framework para aniquilamento de dragões em múltiplas camadas. Escreve vários artigos sobre o framework mas não mata o dragão.

.NET
Chega, olha a ideia do Javanês e a copia, tenta matar o dragão, mas é comido pelo réptil.

ASP
Os componentes necessários para levantar a espada são proprietários e caros. Outros tantos componentes proprietários para achar a localização do dragão, e mais outros tantos a localização da princesa. Chama então seu amigo programador de PHP.

C
Chega, olha para o dragão com olhar de desprezo, puxa seu canivete, degola o dragão. Encontra a princesa, mas a ignora para ver os últimos checkins no cvs do kernel do linux.

C++
Cria um canivete básico e vai juntando funcionalidades até ter uma espada complexa que apenas ele consegue entender… Mata o dragão, mas trava no meio da ponte por causa dos memory leaks.

COBOL
Chega, olha o dragão, pensa que tá velho demais para conseguir matar um bicho daquele tamanho e pegar a princesa e, então, vai embora de volta ao seu mundinho.

Pascal
Se prepara durante 10 anos para criar um sistema de aniquilamento de dragão… Chegando lá descobre que o programa só aceita lagartixas como entrada.

Visual Basic
Monta uma arma de destruição de dragões a partir de vários componentes, parte pro pau pra cima do dragão e, na hora H, descobre que a espada só funciona durante noites chuvosas…

PL/SQL
Coleta dados de outros matadores de dragão, cria tabelas com N relacionamentos de complexidade ternária, dados em 3 dimensões, OLAP, demora 15 anos para processar a informação. Enquanto isso a princesa virou lésbica.

Ruby
Chega com uma puta fama, falando que é o melhor, o faz tudo, quando vai enfrentar o dragão mostra um videozinho dele matando um dragão. O dragão come ele de tédio.

Smalltalk
Chega, analisa o dragão e a princesa, vira as costas e vai embora, pois eles são muito inferiores.

shell
Cria uma arma poderosa para matar os dragões, mas, na hora H, não se lembra como usá-la.

shell(2)
O protagonista chega no dragão com um script de 2 linhas que mata, corta, stripa, empala, pica em pedacinhos e empalha o bicho, mas na hora que ele roda, o script aumenta, engorda, enfurece e coloca álcool no fogo do dragão.

ASSEMBLY
Acha que está fazendo o mais certo e enxuto, porém troca um A por D (Dragon => Aragon), mata a princesa e transa com o dragão.

Fortran
Chega, desenvolve uma solução com 45000 linhas de codigo, mata o dragão vai ao encontro da princesa… mas esta o chama de tiozinho e sai correndo atrás do programador Java que era elegante e ficou rico.

FOX PRO
Desenvolve um sistema para matar o dragão, por fora é bonitinho e funciona, mas por dentro está tudo remendado. Quando ele vai executar o aniquilador de dragões lembra que esqueceu de indexar os DBF’s.

CLIPPER
Monta uma rotina que carrega um array de codeblocks para insultar o dragão, cantar a princesa, carregar a espada para memória, moer o dragão, limpar a sujeira, lascar leite condensado com morangos na princesa gostosa, transar com a princesa, tomar banho, ligar o carro, colocar gasolina e voltar pra casa. Na hora de rodar recebe um “Bound Error: Array Access” e o dragão come ele com farinha.

PHP
Cria um hash para engolir o dragão parte por parte. Quando percebe que o dragão é muito grande, faz um rollback e altera o php.ini para aumentar o tamanho da garganta. Tenta novamente engolir o dragão pedacinho por pedacinho e infelizmente não consegue. Por final exibe a mensagem de que não consegue engolir o dragão e informa ao desenvolvedor que por mais que ele tente ele nunca conseguirá devorar o dragão.

Emacs
Chega, nem olha para o dragão e já coloca óculos escuros. Abre o editor, joga um pouco de tetris, entra no irc, avisa aos amigos que vai matar um dragão, envia email para mais amigos dizendo que irá matar um dragão com o Emacs, digita uma combinação de quatrocentas e trinta e duas teclas, todos notam que duas letras acabam de ser escritas no peito do dragão, VI. Então ele digita uma outra combinação de quatro mil seissentas e quarenta e nove teclas e simplesmente desintegra o dragão.

LISP
Chega, enterra o dragão em um monte de parênteses, casa com a princesa e tem um filho que resolve virar matador de dragões.

Prolog
O programador de prolog (uma cara que se acha inteligente por conhecer conceitos de inteligência artificial), faz um programa que servira apenas pra ver se o dragão tem parentes distantes. Aí ele resolve colocar recursos de Java junto com prolog. Aí ele acaba abandonado o prolog e programando em Java. E cai no mesmo paradigma do Javanês.

NEO (vulgo Capa-Preta)
Olha o dragão e pensa: “There´s no Dragon…” Toma a pílula vermelha, fica doidão, pega o dragão, a princesa, a Trinity, a Perséfone, as programadoras de Java, VB, .NET, etc. e quem mais estiver lá.

ANALISTA DE PROCESSOS
Chega ao dragão com duas toneladas de documentação desenvolvida sobre o processo de se matar um dragão genérico, desenvolve um fluxograma super complexo para libertar a princesa e se casar com ela, convence o dragão que aquilo vai ser bom pra ele, e que não será doloroso. Ao executar o processo ele estima o esforço e o tamanho do estrago que isso vai causar, a assinatura do papa, do buda e do Raul Seixas para o plano, e então compra 2 bombas nucleares, 45 canhões, 1 porta aviões, contrata 300 homens armados até os dentes, quando na verdade necessitaria apenas da espada que estava na sua mão o tempo todo.