FreeMind – Aplicação de mapas mentais
VS2010 RC1: Dynamic Support
Revista PROGRAMAR Edição 23 – Março de 2010
Saiu uma nova edição da Revista PROGRAMAR, com vários artigos, entre eles a Introdução a programação de ANDROID. Espero que gostem, boas leituras.
Yarrrr, we're all pirates.
A pirataria é um tema polémico na (nossa) sociedade. É daquelas hipocrisias lixadas que, juntamente com a falta de conhecimento e a incapacidade de realizar duas sinapses em simultâneo, levam a uma desinformação em massa. Então, com associações como a PassMusica, a MAPINET, a SPA e afins, que fazem uma argumentação que é no mínimo.. peculiar sobre este assunto, não podemos ir longe.
Os acérrimos defensores anti-pirataria baseiam o seu pensamento em três pilares base:
1) A pirataria é má, financeiramente, para os artistas
2) A pirataria é roubo
3) A pirataria prejudica a industria musical e, por conseguinte, a música
Bem. Isto não vai ser fácil. Os argumentos são de peso e, à primeira vista, perfeitamente coerentes e cogentes com a verdade. Irei então, só pela diversão do exercício mental, tentar provar o contrário.
1) A pirataria é má, financeiramente, para os artistas
Bem, vamos lá a ver. Este argumento pode desdobrar-se em três pontos: a) Quem pirateia não vai comprar álbuns, b) Quem pirateia não vai a concertos e c) Os artistas perdem dinheiro por cada álbum pirateado.
A primeira alínea é, a meu ver, errada. Podia dar o exemplo da minha pessoa - que é sempre um óptimo exemplo de rectidão -, de vários amigos meus, de pessoas que conheço, de pessoas que sei que não o fazem assim. Até diria mais: todos os álbuns que possuo (à excepção de um) foram comprados após ter conhecimento da banda por pirataria. Portanto, em última análise, os artistas a quem eu comprei os álbuns após a pirataria lucraram com a pirataria, pois, de outro modo, era muito mais difícil eu tomar conhecimento da sua música e adquirir os álbuns.
A segunda alínea é ainda mais errada. Se a alínea anterior for dúbia, esta é óbvia. Parece que as major (e principalmente as minor) labels ainda não perceberam que a pirataria é o maior meio de divulgação de um artista. Mais que rádios, mais que singles, mais que ofertas. A Internet fornece, graças a serviços como a Last.FM [1], Pandora [2], etc, meios muito eficazes de descoberta de novos artistas. E, após a experimentação de um álbum convenientemente descarregado da Internet num bitrate decente, uma divulgação que seria impossível de atingir por outros meios. Essa divulgação permite que as pessoas possam entrar em contacto com novas bandas e, obviamente, predisporem-se mais facilmente a assistir a um concerto perto de si - até diria, por um preço mais alto do que seria de esperar.
O maior problema aqui parece-me ser óbvio: as labels recebem bastante menos dinheiro com as tours do que com a venda de álbuns.
A terceira alínea é mais chata, porque até é de certo modo verdadeira (mas com limites). Se tivermos em atenção que, antes da era da Internet, as pessoas compravam álbuns por recomendação ou por curiosidade, sem saber se iriam gostar ou não do álbum, é uma conclusão lógica que o facto de as pessoas puderem experimentar o álbum de graça antes de o comprar leva a uma diminuição das vendas. No entanto, podemos perguntar onde está a ética de vender um produto sobre o qual o consumidor pouco ou nada sabe - sim, porque nunca era dada a oportunidade de ouvir um álbum antes de o comprar, salvo um ou outro single que passasse na rádio. E este ponto parece-me fulcral: se, com praticamente todos os outros produtos, termos uma noção mais ou menos exacta do funcionamento, das características e afins dele, o mesmo não se passa com o caso da Música. No entanto, este argumento, per se, não deixa de ser verdadeiro.
No entanto, vejamos uma coisa. Os artistas lucram bastante mais em concertos e tours do que com cada álbum vendido. Por exemplo, numa label mainstream, o revendedor do CD ganha mais por CD vendido do que o artista. [3]. Enquanto que na tour o cachet reverte normalmente para o artista, os ganhos por CD andarão entre os 3% e os 25% por CD vendido [4]. Portanto, é lógico perguntar se os artistas não lucrarão mais, hipoteticamente, com a pirataria. Certamente que as labels não lucram tanto - ou nada - com este tipo de modelo. Mas os artistas, quem faz a música, é provável que lucrem mais.
2) A pirataria é roubo
Esta é o argumento mais forte. Primeiro que tudo, pode-se definir roubo como a transferência de propriedade de uma pessoa/instituição para outra pessoa/instituição sem o consentimento do dono original. Poder-se-á argumentar facilmente que os artistas não consentem que a sua música seja distribuída de forma livre na Internet. Parece-me uma posição legitima, e estaria a trair-me se dissesse o contrario.
No entanto, é fácil perceber que os artistas terão, em casos normais, vantagens para que essa transição seja facilitada. Portanto, a pirataria é roubo, certo. Mas os artistas estarão a perder possibilidades de negócio. Atenção que eu não defendo que os artistas devam abdicar de todo e qualquer direito sobre a música. Há licenças que permitem que os artistas distribuam a sua obra sem abdicar de direitos sobre ela [5]. O problema é que isto volta a não ser conveniente para as editoras - significa que estão a perder negócio, e do grande. Parece-me legitimo que façam pressão para que isto não aconteça, já que está em causa o seu trabalho. No entanto, a luta é fútil - na minha opinião, é óbvio que a luta está perdida, e só com o fim da Internet como a conhecemos hoje em dia (neutra, relativamente anónima, sem censura governamental, etc) é que poderia haver uma inversão.
As editoras podiam já ter percebido isto e mudado o modelo de negócio, adaptando aos novos tempos. Algumas já o fizeram, com especial destaque para a The Null Corporation [6] do Trent Reznor. E funcionou. As vendas do The Slip e do Ghosts I-IV superaram as expectativas, mesmo estando disponível o download legal de todas as músicas de ambos os álbuns em vários formatos (chegando ao extremo de disponibilizar FLACs de 24/96kHz). E mesmo assim, lucraram imenso - as vendas do Ghosts I-IV chegaram aos 1.6 milhões de US$ [7].
Em suma, a pirataria pode ser considerada roubo, mas essa atitude não é proveitosa para os artistas - precisamente quem as editoras e associações derivadas querem """"proteger"""".
3) A pirataria prejudica a industria musical e, por conseguinte, a música
Este parece-me o ponto fulcral desta discussão. Na verdade, todas as associações e afins que foram referidas no início do post não estão muito interessadas em proteger os artistas; estão muito mais interessadas em proteger-se a si mesmas. Apesar de não ver nada de mal neste tipo de (re)acção, há que considerar que as coisas chegaram a um extremo (hint, hint: fazer downloads de música leva a uma compensação mais elevada do que morrer num acidente de avião [8].
Vamos então por o argumento mais claro:
- A indústria musical é prejudicada pela pirataria
- A música não pode sobreviver sem a indústria musical
- Logo, piratear prejudica a música
A pirataria não prejudica a música. Foi graças à partilha de ficheiros que bandas como os Arctic Monkeys atingiram o grande público [10]. Foi graças à partilha de ficheiros que eu conheci bandas como Cloudkicker (que disponibiliza os seus discos de forma gratuita no seu site [11]), CO.IN [12] e afins. A partilha de ficheiros, a pirataria, é um incentivo para se fazer mais música e melhor música. O público potencial de determinada banda aumentou com a Internet. A música só tem a ganhar com isto.
_____________________
Findo isto, gostaria de dizer que sou obviamente pró-partilha de ficheiros. Digo, sem assombro, que partilho a música que tenho com amigos, colegas e pessoas que não conheço de parte nenhuma. Não acho que seja um direito adquirido ter música à borla, mas acho que pelo menos duas das partes envolvidas (músico e ouvinte) só têm a ganhar com ela. A industria discográfica iria perder, certamente, mas apenas se manter o seu modelo de negócio obsoleto. Havendo uma reviravolta nos planos deles, poderiam perfeitamente ganhar.
Design Patterns using Action Script 3: Structural Patterns (Decorator & Adapter & Composite)
Decorator
Example related in book, that shows use of Decorator Pattern. It´s used when necessary to choose many properties dynamically like the sum of shopping cart products.
File Component.as:
File Decorator.as:
package
{
//Abstract Decorator in Decorator Design Pattern
//**************
//Abstract class
public class Decorator extends Component
{
trace("|*|Decorator|*|");
override public function getInformation():String
{
return information;
}
}
}File ConcreteComponent.as:
package
{
//Concrete Component
public class ConcreteComponent extends Component
{
public function ConcreteComponent():void
{
//\u2794 is Unicode for a right-pointing arrow
information = "Concete Component is decorated with \u2794";
}
}
}File DecConA.as:
package
{
//Concrete Decorator "Alpha"
public class DecConA extends Decorator
{
var components:Component;
public function DecConA(components:Component)
{
this.components=components;
}
override public function getInformation():String
{
return components.getInformation() + " Decoration Alpha:";
}
}
}File DecConB.as:
package
{
//Concrete Decorator "Beta"
public class DecConB extends Decorator
{
var components:Component;
public function DecConB(components:Component):void
{
this.components=components;
}
override public function getInformation():String
{
return components.getInformation() + " Decoration Beta:";
}
}
}File DecTest.as:
package
{
import flash.display.Sprite;
public class DecTest extends Sprite
{
public function DecTest():void
{
//Instantiate Concrete Component
var testComponent:Component = new ConcreteComponent();
//Wrap first decorator around component
testComponent=new DecConA(testComponent);
//Wrap second decorator around component
testComponent=new DecConB(testComponent);
//Output results
trace(testComponent.getInformation());
}
}
}Adapter
Example related in book, that shows use of Adapter Pattern. This pattern allows existing classes to be used in situations that didn´t exist or weren´t anticipated when they were developed.
File Adaptee.as:
package {
public class Adaptee {
public function specificRequest():void {
trace("Called Adaptee:specificRequest()");
}
}
}File Itarget.as:
package {
public interface ITarget {
function request():void
function newOperation():void
}
}File Adapter.as:
package {
public class Adapter implements ITarget {
private var adaptee:Adaptee;
public function Adapter() { // constructor
this.adaptee = new Adaptee();
}
public function request():void {
adaptee.specificRequest();
}
public function newOperation():void {
trace("Called Adapter:newOperation()");
}
}
}File Main.as:
Composite
Example related in book, that shows use of Composite Pattern. The Composite Pattern provides a robust solution to building complex systems that are made up of several smaller components.
File Component.as:
package {
import flash.errors.IllegalOperationError;
// ABSTRACT Class (should be subclassed and not instantiated)
public class Component {
protected var parentNode:Composite = null;
public function add(c:Component):void {
throw new IllegalOperationError("add operation not supported");
}
public function remove(c:Component):void {
throw new IllegalOperationError("remove operation not supported");
}
public function getChild(n:int):Component {
throw new IllegalOperationError("getChild operation not supported");
return null;
}
// ABSTRACT Method (must be overridden in a subclass)
public function operation():void {
}
public function getParent():Composite {
return this.parentNode;
}
internal function setParent(compositeNode:Composite):void {
this.parentNode = compositeNode;
}
internal function removeParentRef():void {
this.parentNode = null;
}
internal function getComposite():Composite {
return null;
}
}
}File Composite.as:
package {
public class Composite extends Component {
protected var sName:String;
protected var aChildren:Array;
public function Composite(sName:String) {
this.sName = sName;
this.aChildren = new Array();
}
override public function add(c:Component):void {
aChildren.push(c);
c.setParent(this);
}
override public function operation():void {
trace(this.sName);
for each (var c:Component in aChildren) {
c.operation();
}
}
override public function getChild(n:int):Component {
if ((n > 0) && (n <= aChildren.length)) {
return aChildren[n-1];
} else {
return null;
}
}
override internal function getComposite():Composite {
return this;
}
private function safeRemove(c:Component) {
if (c.getComposite()) {
c.remove(c); // composite
} else {
c.removeParentRef();
}
}
override public function remove(c:Component):void {
if (c === this) {
// remove all my children
for (var i:int = 0; i < aChildren.length; i++) {
safeRemove(aChildren[i]); // remove children
}
this.aChildren = []; // remove references to children
this.removeParentRef(); // remove my parent reference
} else {
for (var j:int = 0; j < aChildren.length; j++) {
if (aChildren[j] == c) {
safeRemove(aChildren[j]); // remove child
aChildren.splice(j, 1); // remove reference
}
}
}
}
}
}File Leaf.as:
File Main.as:
package {
import flash.display.MovieClip;
/**
* Main Class
* @ purpose: Document class for movie
*/
public class Main extends MovieClip {
public function Main() {
// create root node
var root:Composite = new Composite("root");
// add a node to root
root.add(new Composite("composite 1")); // add node to root as child
root.getChild(1).add(new Leaf("leaf 1")); // add a child leaf
root.getChild(1).add(new Leaf("leaf 2")); // add a child leaf
// add another node
root.add(new Composite("composite 2")); // add node to root as child
root.getChild(2).add(new Leaf("leaf 3")); // add a child leaf
root.getChild(2).add(new Leaf("leaf 4")); // add a child leaf
root.getChild(2).add(new Leaf("leaf 5")); // add a child leaf
// add a child leaf to the root node
root.add(new Leaf("leaf 6"));
trace("display tree");
trace("============");
root.operation();
trace("remove first child of the second child of root");
trace("==============================================");
root.getChild(2).remove(root.getChild(2).getChild(1));
root.operation();
trace("remove the second child of root");
trace("===============================");
root.remove(root.getChild(2));
root.operation();
}
}
}
Vulnerabilidades Site Novas Oportunidades
Já há algum tempo que tenho andado a investigar sites nacionais em busca de falhas de segurança e quase todos as têm, as mais frequentes são as falhas XSS mas também é muito comum encontrar falhas de SQL Injection.
Hoje tive acesso através de um tweet do Público (http://bit.ly/aU0kuy) à informação de que o site das Novas Oportunidades tinha sido explorado e alterado por alguém… Decidi então enquanto era tempo verificar as falhas que existiam no site e qual o meu espanto (not) quando vejo presentes falhas de XSS, falhas de SQL Injection e falhas de validação de parâmetros que permitem Impersonation Attack através de injecção de URL.
O ataque relatado pelo público foi feito através de SQL Injection possivelmente na página seguinte pois esta está totalmente aberta a ataques deste género: http://testemunhos.novasoportunidades.gov.pt/detalhe_video.aspx
O ataque que referi relativo a problemas de validação de parâmetros que permitem injecção de URL: http://www.novasoportunidades.gov.pt/outerFrame.jsp?link=http://joaopedropereira.com/blog/
Com alguma imaginação pode-se fazer alguns ataques interessantes a partir daqui…
Na pesquisa também podemos facilmente fazer ataques de XSS (Cross Site Scripting) como referi anteriormente: http://www.novasoportunidades.gov.pt/np4/q?q=%3Cscript%3Ealert%28%22The+Blog+of+a+WebDeveloper%22%29%3C%2Fscript%3E
Isto mostra a preparação e conhecimentos ao nível de segurança informática que os WebDevelopers que o estado contrata têm… Atenção este não é o único site governamental com problemas graves de segurança, existem mais e talvez que transaccionem dados mais importantes…
Nota: Este post não tem como intuito incentivar qualquer tipo de ataque informático, pretende apenas informar e alertar para os problemas informáticos que podem surgir num futuro nas infraestruturas governamentais (e não só). É importante ter as nossas plataformas o mais seguras possíveis, para não sermos surpreendidos um dia.
EDIT
As falhas estão a ser corrigidas, quase completas por isso para registo futuro adicionei screenshots das falhas. É também de valor ler e participar nos comentários a este post que estão a dar uma boa análise do Web Development nacional.
EDIT 2
Governo desmente ataque informático: Portal Novas Oportunidades não foi alvo de ataque informático . Provavelmente precisam que venha algo abaixo e que cause danos a muitas pessoas para admitirem os erros…
Reparem ali no melão!
Reparem ali no melão (leia-se EDIT do dia seguinte) do Usando o GMail para guardar filmes online.
Basicamente este post é um apelo à mais sugestões para o efeito :D
Usando o GSpace para guardar filmes online
**********AVISO**********
Esta entrada refere-se apenas a ficheiros que sejam propriedade privada do manipulador do próprio, não estejam protegidos por Direitos de Autor ou sejam de livre distribuição e divulgação. O autores deste Blog não se responsabilizam pelas ilegalidades que possam vir a ser cometidas a partir da informação aqui partilhada.
**********AVISO**********
Acabaram-se os discos rígidos externos!!
Para o pessoal que anda sempre em viagens sabe o atrofio que é andar a carregar com os discos rígidos para trás e para a frente. Agora até há os discos mais pequenos que basta ligar por USB, mas antigamente os discos eram enormes e era necessário o carregador e tudo mais, carregar com isso em viagens de avião quando o espaço e o peso já é limitado é no mínimo muito incómodo. E mesmo os discos pequenos acabaram-se :D
Depois há também o problema de os disco se avariarem. Felizmente a mim ainda nunca me aconteceu mas para João Duarte (JA prós amigos) isso é o ‘pão nosso de cada dia’.
Deixo-vos neste post mais um conceito. Pequenas coisas que não têm ciência nenhuma mas que por vezes são difíceis de surgir à ideia. :) Já aqui vos tinha deixado um outro conceito em comodidade informática :D
Vou usar os filmes como exemplo pois são os ficheiros com maior tamanho que normalmente lidamos. Mas, obviamente, o conceito pode ser aplicado a qualquer tipo de ficheiros ou árvore de pastas de grande tamanho.
Já falámos aqui de como o GSpace é utilizado para usar o espaço disponibilizado pelas contas de e-mail da Google como repositório de ficheiros online.
Se a isso aplicarmos a compressão de ficheiros em rar em múltiplas partes (file.r00, file.r01, file.r02 …) facilmente obtemos um repositório de espaço infinito online para guardarmos os nosso filmes e séries.
Deixo-vos aqui com a explicação de como arquivar um ficheiro ou pastas em formato múltiplo de rar em linux.
Conselhos:
- criem ficheiros .r00 não maiores que 6 MB. Assim caso a ligação com a vossa conta de e-mail for a baixo vocês não perdem o que já sacaram, podem continuar sem qualquer problema a fazer o download/upload do resto do ficheiros rar.
A velocidade de download do filme a partir de uma conta de e-mail creio que é muito semelhante à velocidade de um download directo. Pelo que com uma boa ligação à net, 600 Kb/s podem ser perfeitamente alcançados.
Uma vez com os ficheiros .r no pc basta clicar no file.r00 e fazer extrair, e dos ficheiros rar será extraído o vosso filme/pasta.
Assim já não precisam de andar com o disco para trás e para a frente cada vez que vão ver um filme à casa dum amigo ou vão fazer o doutoramento para fora :D :D Ah!! É óbvio que este tutorial também se aplica a quem for fazer tese de mestrado.
EDITADO (o dia seguinte):
P.S. – Claro que algumas restrições têm de ser aplicadas. Estive agora a tentar fazer o upload de 700 Megas para o GMail e deparei-me com isto :D
This account has been locked down due to unusual account activity. It may take up to 24 hours for you to regain access.
Unusual account activity includes, but is not limited to:
1. Receiving, deleting, or downloading large amounts of mail via POP in a short period of time.
2. Sending a large number of undeliverable messages (messages that bounce back).
3. Using file-sharing or file-storage software, browser extensions, or third party software that automatically logs in to your account.
4. Leaving multiple instances of your Gmail account open.
5. Browser-related issues. Please note that if you find your browser continually reloading while attempting to access your Inbox, it’s probably a browser issue, and it may be necessary to clear your browser’s cache and cookies.If you feel that you have been using your Gmail account according to the Gmail Terms of Use, you can troubleshoot your problem by clicking here.
Claro que, não deixa de servir como repositório, mas têm de ir com calma :D :D Apesar de não ter sido 100% sucedida esta dica, também não foi completamente anulada :D
Comprimir e dividir grandes ficheiros com o rar em Linux
Este tutorial pode ser quando queremos armazenar ficheiros de tamanho superior a 4GB ou ficheiros de tamanho muito reduzido em discos formatados em FAT32. Pode também servir para esta outra dica que vos deixo nesta outra entrada.
Informação retirada de Linux by Examples
Antes de mais, para quem usa Ubuntu,
sudo aptitude install rar unrar
Para comprimir e dividir um grande ficheiro, como um filme por exemplo, em múltiplos ficheiros de tamanho inferior até 12Mb
rar a -m5 -v12m -vn meuficheiro filme.avi
Este comando irá criar múltiplos ficheiros denominados meuficheiro.r00 (*.r01, *.r02) com 12Mb cada um. Se retirarem o comando -vn serão criados ficheiros do tipo meuficheiro.part1.rar (meuficheiro.part2.rar, …)
É possível escolher a qualidade de compressão, -m5 é a mais elevada, demorando por isso mais tempo. -m0 não aplica qualquer compressão e apenas divide os ficheiros, -m3 é a opção por omissão.
Eu aconselho-vos os seguintes tipos de compressão:
-m5 para ficheiros tipo text e similares -m0 para filmes
a compressão que eu consegui com filmes é insignificante comparada com o tempo extra (horas) que leva a comprimir o ficheiro em -m5.
Para descomprimirem o ficheiro basta
rar e meuficheiro.part1.rar
ou
rar e meuficheiro.r00
Gspace

Boas pessoal,
Deixo-vos com uma ferramenta muito boa para fazer backups dos vossos ficheiros. Uploads directos para a internet, com organização por pasta e a cima de tudo espaço ilimitado.
Tudo através de um add-on para o Firefox que vos permite usar a vossa conta do GMail como um disco rígido online. Por questões de organização aconselho-vos a criarem uma conta diferente para os backups.
Bastante útil para backups de trabalho. Quantas vezes já não vos aconteceu deixarem o relatório na outra pen?! :D
Site do Gspace
Uma vez instalado no Firefox cliquem em Ferramentas -> GSpace. Do lado direito vão ter o vosso navegador de ficheiros dentro do email e do lado esquerdo o do vosso computador. O GSpace permite usarem diversos tipos de visualização/manipulação dos ficheiros, eu aconselho-vos File Transfer Mode.
O regresso…
Faz agora dois meses desde o meu último post neste blog. É verdade que nos últimos meses tenho andado bastante afastado daqui, um pouco por dislexia minha, admito. No entanto, também não tenho tido toda a disponibilidade desejada… Aulas aliadas ao ciclismo têm-me mantido bastante distante deste blog, situação que espero (alias, tenho a certeza) que vou melhorar daqui para a frente.
Ou seja, isto é uma promessa que voltarei, brevemente (tipo… amanhã?)!
Até já!!
Design Patterns using Action Script 3: Creational Patterns (Factory & Singleton)
I´m reading the O´Reilly book “ActionScript 3.0 Design Patterns”. Following are examples related in this excellent book but modified by me. This is the first part, about creational patterns (Singleton and Factory).
Singleton
Class User.as, used to store user proprieties.
package classes
{
public const User:_Singleton = new _Singleton();
}
/**
* Class Singleton with proprieties to use in application
*/
internal class _Singleton
{
function _Singleton(){}
public var id:int;
public var name:String;
public var description:String;
public var username:String;
public var password:String;
}Factory
Example related in book, that shows creation of products.
File Creator.as:
package example {
import flash.errors.IllegalOperationError;
// ABSTRACT Class (should be subclassed and not instantiated)
public class Creator {
public function doStuff():void {
var product:IProduct = this.factoryMethod();
product.manipulate();
}
// ABSTRACT Method (must be overridden in a subclass)
protected function factoryMethod():IProduct {
throw new IllegalOperationError("Abstract method: must be overridden in a subclass");
return null;
}
}
}File CreatorA.as:
package example {
// Concrete creator A (subclass of Creator)
public class CreatorA extends Creator {
override protected function factoryMethod():IProduct {
trace("Creating product 1");
return new Product1(); // returns concrete product
}
}
}File CreatorB.as:
package example {
// Concrete creator B (subclass of Creator)
public class CreatorB extends Creator {
override protected function factoryMethod():IProduct {
trace("Creating product 2");
return new Product2(); // returns concrete product
}
}
}File IProduct.as:
package example {
public interface IProduct {
function manipulate():void;
}
}File Product1.as:
package example {
internal class Product1 implements IProduct {
public function manipulate():void {
trace("Doing stuff with Product1");
}
}
}File Product2.as:
package example {
internal class Product2 implements IProduct {
public function manipulate():void {
trace("Doing stuff with Product2");
}
}
}{
public const User:_Singleton = new _Singleton();
}
/**
* Class Singleton that represents proprieties used to change language
*/
internal class _Singleton
{
function _Singleton(){}
public var id:int;
public var name:String;
public var description:String;
public var username:String;
public var password:String;
}









