HashCode

An organizer of symbols

Archive for June, 2007

(’asterisco’ == 42.chr) != ?* => true

Wednesday, June 27th, 2007

Estava comprando alguns livros e achei um de promoção “O Signo, de Isaac Epstein” foi baratinho, mas também oitenta páginas… O livro em si me despertou um grande interesse pelo assunto de semiótica. Não demorou para que adquirisse o livro “Semiótica, de Charles S. Peirce” que define semiótica como a filosofia científica da linguagem. Linguagem no sentido de algo provê a comunicação entre duas ou mais coias através de elementos, como signos, sons, símbolos, mímicas e outros. A Semiótica é redefinida por vários autores mas a definição de Charles detêm minha atenção mais do os outros que consideram apenas uma disciplina da cadeira de lingüística.

Na graduação de Ciência da Computação a matéria que mais me interessou(e interessa) foi(é) Linguagens Formais e Compiladores, vendo a formação dos componentes de uma gramática, a validação, organização e significado de símbolos e palavras de um determinado código-fonte. Os passo dos analisadores léxicos, sintáticos e semáticos nada mais é do um dos nossos sistemas de interpretação de mensagens.

Desde a infância passamos pelos mesmos processos te entendimento dos signos e vamos adquirindo base de conhecimento capacitando-nos a detecção de padrões dos mais simples aos mais complexos, como: “se há fumaça => há fogo”, “se algo está úmido => é porque tem algo líquido”. Parece fácil mas as vezes ao pensarmos em uma solução nos deparamos com a falta desta comparação do que conhecemos e o que é novo.
Vamos fazer um estudo de caso de um símbolo o asterisco.

O Asterisco

Se perguntarmos o que é * a uma criança que não conhece a palavra asterisco teremos entre outras respostas algo como “é uma estrelinha”, “um pontinho explodido”…. Para um adulto a afirmação é um “asterístico” e para os mais sensatos “asterisco” lexicograficamente correto. Portando entramos na idiossincrasia; que é a forma de percepção individual do símbolo. Por exemplo, cada um tem o asterisco como um símbolo que representa algo de forma distinta.

Qual a função(significado) do símbolo asterisco?

Não sei. Depende da linguagem, do contexto em que se encontra.

Para a língua portuguesa ele não faz parte da gramática e nem do alfabeto. Em anúncios sabemos que ele é o “porem ou o lá-invem!”. Exemplo.: ‘Fale a R$ 0,01*’, nas letras bem pequenas temos ‘promoção válida somente para falar que ama sua sogra no dia 30 de fevereiro’. Em alguns livros o * induz ao leitor ler o rodapé explicativo, etc. Já na informática comum pode ter vários significados. Temos alguns:

- Em um editor de texto moderno tenta detectar que o * é um marcador e troca por uma bolinha.
- Caractere de multiplicação
- Todos arquivos em uma lista de arquivos. Ex: ls *.txt

Veja a cima que o asterisco é também um ‘Caracter de multiplicação’. Agora você lembra da terceira série que o x era o sinal de multiplicação? E mais adiante …

2 x 2 = 4

depois

2 . 2 = 4

e agora no computador

2 * 2 = 4

Calma, não fique louco, já passamos desta fase… mas deu para entender um pouco sobre idiossincrasia. A sua idiossincrasia tem que ser mutável principalmente para usar a linguagens de programação como C e Ruby. Em C temos ponteiro com * para o valor e ** ponteiro para apontador…, comentários e assim vai. Demonstraremos abaixo como o asterisco pode ser genérico em uma linguagem computacional, Ruby.

Asterisco em Ruby
O caracter

42.chr #=> '*'

o valor ASCII do caracter

?*   #=> 42

Em Ruby o asterisco pode ser um método
Multiplicação (Numeric * Numeric)

2 * 2       #=>  	4

Potenciação (Numeric ** Numeric)

2**3	  #=> 8

Classe String(String * Numeric)

'ha! '  * 5	#=> 'ha! ha! ha! ha! ha! '

Classe Array (Array * String)

[20, 30, 40] * ':'   #=> '20:30:40'  o mesmo que join

Observe que o resultado que é a multiplicação de todos os elementos e não uma operação distributiva de matemática. (Array * Fixnum)

[20, 30, 40] * 2 #=> [20, 30, 40, 20, 30, 40] 

mas podemos redefinir o método * para um resultado diferente

a=[20, 30, 40]
def a.*(valor)
  self.map{|v| v*valor}
end
a * 2     #=> [40, 60, 80]

Expressões Regulares, zero ou mais ocorrências

a='asterisco'
a =~ /a*/      #=> 0
a =~ /z*/      #=>0

Atribuição
Atribuição com multiplicação

d=2
d*=2   #=> 4

Atribuição com potenciação

d=2
d**=3  #=> 8

Atribuição paralela

a=[1,2,3,4]
x,y=a      #=> x =1 e y=2
x,*y=a    #=> x=1 e y=[2,3,4]
x,*y=33  #=> x=33 e y=[]

Conversão em Array de um argumento de bloco

a=[1,2,3,4,5]
a.each {|v| puts v}
1
2
3
4
5
a.each {|*v| puts v}
[1]
[2]
[3]
[4]
[5]

Argumentos de linha de comando

ruby -e 'puts $*' teste1 teste2

resultado

teste1
teste2

equivalente ao ARGV

ruby -e 'puts ARGV' teste1 teste2

resultado

teste1
teste2

Utilização em argumentos
Na definição do método

def teste(um_valor, *argumentos)
  puts 'valor = '  + um_valor.to_s
  puts 'args = '  + argumentos.join(', ')
end

utilizando o método teste

teste('A',2,'B',4,5,6,7)

resultado

valor = A
args = 2, B, 4, 5, 6, 7

passando um array

array=[20,'C',40,'D']
teste(array)

resultado

valor = 20C40D
args =

mas com a mágica do *

array=[20,'C',40,'D']
teste(*array)

resultado

valor = 20
args = C, 40, D

o mesmo vale para o case. Case normal

s='teste'
case s
  when Fixnum: puts 'N'
  when String,Symbol: 'S'
 end

resultado

'S'

podemos fazer assim com *

s='teste'
tipos=[String,Symbol]
case s
  when Fixnum: puts 'N'
  when *tipos: 'S'
 end

resultado

'S'

Asterisco em Ruby dá nó na cabeça mas depois começamos a entender a idiossincrasia do Matz.

Rghost v0.7 Encodings e proxy charset

Wednesday, June 13th, 2007

Com a versão 0.7 podemos agora usar diferentes codificação de fontes e conversão de charset de Ruby para Postscript.
Encodings disponíveis

  • AdobeExpert
  • AdobeLatinEncoding
  • Bengali
  • CodePage1250
  • CodePage1251
  • CodePage1252
  • CodePage1253
  • CodePage1254
  • CodePage1256
  • CodePage1257
  • CodePage1258
  • CodePage874
  • IsoLatin
  • MacCentralEuropean
  • MacCyrillice
  • MacGreek
  • MacHebrew
  • TeX-CorkEncoding
  • TeX-LGR-Greek
  • TeXMathExtensionEncoding
  • TeXMathItalicEncoding
  • TeXMathSymbolEncoding
  • TeX-T2AModified2Encoding
  • TeX-T2BAdobeEncoding
  • TeX-T2CAdobeEncoding
  • TeX-X2AdobeEncoding
  • TeX-XL2encoding
  • US-ASCII
  • UTF-8

Ideal para código fonte Ruby no mesmo formato dos dados do documento. Existem duas formas de setar o encoding da fonte:
Antes de usar o documento

RubyGhostConfig::GS[:font_encoding] = 'CodePage1252'

Na criação do documento

doc=Document.new :font_encoding => 'CodePage1252'

Agora quando o charset do código fonte está diferente dos dados é necessário a conversão dos formatos. Para este fim usamos um bloco retornando uma string antes da criação do documento.

Exemplo para código fonte no padrão UTF-8 com acentuação.

RubyGhostConfig::GS[:charset_convert]= lambda {|text| Iconv::iconv('latin1','utf8', text).to_s}

O gem e o manual da versão 0.7 disponível no RubyForge.

RGhost (Beta)

Tuesday, June 5th, 2007

Rghost é uma API de criação e conversão de documento.

Uma forma de criação e vários outputs.
flow2.png
Usa o ghostscript framework para conversão de formatos. Com:

  • Legado de 16 anos de conversão de documento do Ghostscript.
  • Renderização
    • Matriz de dados otimizada
    • Permite configurar a pilha de dados interna
    • Homologado até 5.800 páginas(=~ 464.000 registros) para Linux Intel
    • Homologado até 10.000 páginas(=~ 800.000 registros) para Linux Sparc
  • Unidades
    • Cm, inch e psunit
    • Permite personalização de unidade
  • Fontes
    • 9 fontes internas(pfb)
    • GNU Barcodes(ean,i25, code39, code128)
    • Fontes binárias
    • Distorção de fontes
    • Fontes asiáticas
    • Suporte a Latin1(ISO-8859-1)
  • Cursores
    • Ponto absoluto, ponto relativo, deslocamento da origem, etc
    • Salto de página e controles de faixa dinâmicos
    • Papel
    • Disposição landscape e portrait
    • Papeis pré-definidos
    • Papeis com tamanho personalizado
    • Controle de margem de silêncio
  • Texto
    • Área de texto com tags.
    • Texto em ponto absoluto e relativo
    • Alinhamento ao ponto
    • Alinhamento pela página
    • Avaliação de variáveis internas em postscript
  • Cores
    • CMYK
    • RGB
    • Grayscale
  • Geometrias
    • Arcos, retângulos, linhas, etc
    • Predefinições auxiliares de linhas e backgrounds de faixas
  • Imagens e Templates de entrada
    • GIF e JPEG
    • EPS
  • Grade de dados para
    • Matriz de dados
    • CSV
    • ActiveRecord
    • Personalização de colunas de dados
    • Formatador de dados
    • Estilos predefinidos
  • Document Callbacks
    • :before_page_create, :after_page_create,:odd_pages,:even_pages, :before_document_create,:first_page, last_page e :after_document_create
  • Grid Callbacks
    • :before_row, :after_row, :even_row,:odd_row, :before_column, :after_column, :even_column, :odd_column, :before_table_create e :after_table_create
  • Conversor de PDF
  • Outputs(mais usados)
    • PDF, PS, PNG, EPS, JPG, TIF, laserjet, deskjet e X11

Versão Beta, por favor reporte bugs e sugestões.

RDOC
Manual Ruby Ghost Engine(pdf)

gem install rghost