APintex, Conheco perfeitamente o sintoma à alguns anos. Também existe um problema que começa a dar um erro no FB (reportado por mim à muito tempo e com muitos requests e também sem correcção). O workaround é fechar e voltar a abrir !
Posso te dizer que antes com 4 GB ram e disco normal, demorava vários segundos a arrancar o OS, muitos segundos a abrir o FB e era impensável ter uma outra app aberta que consumi-se mais do que alguns dezenas de MB de RAM. Agora com 8 GB ram + disco SSD, demora 2 segundos a ter o OS totalmente pronto, o FB deve demorar uns 3-4 segundos a estar operacional e é possível ter outro programa aberto (Eclipse, VirtualBox com 2 GB ram dedicado !). Não sei se foi apenas da ram, disco ou tudo junto mas fica a nota. 2014-09-04 18:22 GMT+01:00 Apintex <[email protected]>: > Hugo, a razão pela qual quero sair do FB é por ficar demasiado lento e > consumir recursos passados 20min e se abrir um segundo projecto. > > Att, > > António Pinto > > No dia 04/09/2014, às 17:28, Hugo Ferreira <[email protected]> > escreveu: > > APintex, > > Ainda não tinha pensado nisso mas é bem verdade. > > Eu mudei para o OS X à 2 anos e digo-te é sem V de volta. Todos os > portáteis baratos ou caros que passam pelas minhas mãos não chegam ao fim > da garantia e este é impecável. Nada a apontar. De tal forma que após > acabar a garantia, investi para duplicar a RAM e troquei o disco por um SSD > e com garantia da Apple. Digo-te que valeu cada cêntimo principalmente para > o FB que abusa da máquina. > > Por um lado gostaria de saír do FB. É um IDE preso no tempo :( mas por > outro lado serve o seu propósito e pelo que sondei, os outros não estão à > altura. > > Eu uso o MySQL em paralelo com o SQL Server à uns anos. Ao fim de algum > tempo de conheceres bem os motores, consegues fazer SQL quase 100% > compatível sem um ORM (principalmente se usares SQL Server 2012+). > > Todos os projectos que faço, faço logo compatíveis com esses 2 motores. > > Para reports (que nenhum dev gosta) para AIR recomendo o único que > conheço: Stimulsoft mas é client-side. Podes usar uma app AIR via linha de > comandos no servidor para gerar reports como workaround se precisares de > reports no lado do servidor com PHP. > Têm um solução ASP.NET para quem usar este backend sem workarounds. > > Já disse no forum que se fizeram um solução HTML5 (puro) estou disposto a > pagar em avanço. Dizem que é algo que andam a pensar :) > > > 2014-09-04 17:17 GMT+01:00 APintex Gmail <[email protected]>: > >> 2014 foi e está a ser um ano de mudanças... >> Passei do Windows para o OS X, quero passar do Flash Builder para o >> IntelliJ IDEA (ainda não tive coragem) >> Estou a refazer um projecto de .Net para AIR, de MSSQL para MySQL e >> webservices feitos em .Net para PHP. >> No meio disto tudo o que mais me custa são os reports (uma seca para mim >> desde sempre) >> >> António Pinto >> [email protected] >> >> >> >> No dia 04/09/2014, às 16:58, Hugo Ferreira <[email protected]> >> escreveu: >> >> É como eu. Na realidade acredito que a maioria esteja no mesmo barco. >> Para coisas a sério ainda não. >> Quem já trabalha à anos com Objective-C, irá continuar mesmo após o Swift >> se tornar uma realidade viável. >> >> Terminei o meu primeiro projecto HTML5 e correu muito bem. No final >> demorei muito menos tempo do que previa e já tenho agora uma base para >> fazer o próximo mais rapidamente. >> >> Quando houver tempo irei recriar um projecto em Flex com HTML5 e mais >> tarde outro (se isto algum dia vier a acontecer) e depois disso acho que >> não voltarei a usar o Flash ! >> >> O AIR vou continuar a usar e abusar e também muito código nativo com >> Android. >> >> Também acho que o Swift será uma realidade para mim só para o ano que vem >> ! >> >> >> 2014-09-04 16:48 GMT+01:00 Apintex <[email protected]>: >> >>> Hugo, para já é pura curiosidade no Swift. Instalei o Xcode 6 beta e nem >>> o abri. :( >>> Vou vendo alguns exemplos para ir aprendendo alguma coisa e partilho com >>> vocês os que acho importantes. >>> Estou a terminar um projecto (MoneyEX Pro) e só no início do próximo ano >>> começarei a trabalhar com o Swift. >>> >>> Att, >>> >>> António Pinto >>> >>> No dia 04/09/2014, às 16:10, Hugo Ferreira <[email protected]> >>> escreveu: >>> >>> APintex, >>> >>> Acabei à pouco tempo de ler 2 bons livros de desenvolvimento Android. >>> Já desenvolvi diversas ANE's para Android e já me sinto suficientemente >>> confortável para desenvolver qualquer app para Android ou mesmo ANE. >>> >>> Em breve gostaria de entrar no desenvolvimento nativo para iOS (tanto >>> apps como ANE's) e aqui ficam algumas dúvidas: >>> 1. Não faz sentido nesta altura do campeonato investigar em Objective-C >>> (thank you god); >>> 2. Será que não vale a pena esperar por um bom livro que seja uma >>> compilação do desenvolvimento Swift (de preferência em PT). Ainda não vi >>> nenhum na Fnac; >>> 3. Será que irá ser possível desenvolver ANE's com swift. Penso que aqui >>> a única coisa que falta é a lib que actualmente é para Objective-C (para >>> alguém transcrever tem de saber bem Objective-C) ou será possível usar a >>> actual ? >>> >>> As minhas expectativas são: >>> - Dentro de 1 ano o iOS8 tenha mais de 80% de market share para valer a >>> pena; >>> - Existam bons livros e exemplos; >>> - Exista um lib para Swift (a Adobe tem de fazer) ou ser possível usar a >>> actual (não sei); >>> - Exista uma framework para Bluetooth LE (para mim é importante) tal >>> como já existe com Objective-C ou se possa usar as actuais. >>> >>> >>> >>> 2014-09-04 15:58 GMT+01:00 APintex Gmail <[email protected]>: >>> >>>> >>>> António Pinto >>>> [email protected] >>>> >>>> >>>> >>>> http://realm.io/news/swift-enums-pattern-matching-generics/ >>>> >>>> Sign up to be notified of future videos >>>> >>>> We won't email you for any other reason, ever. >>>> ------------------------------ >>>> Enums (0:40) >>>> >>>> Enums are a kind of abstraction that allow you to give a variable one >>>> value among several related values. For example, when building a state >>>> machine you could have an enum that describes the state of an object from a >>>> set number of states. There are three types of enums in Swift. >>>> Basic Enum (1:12) >>>> >>>> The most basic Swift enum simply has a bunch of cases and is declared >>>> using the enum key word. In this example, the enum is called Direction and >>>> can only be one of the four provided cases. To declare an enum, you use the >>>> enum name, followed by a dot and then one of the possible values. Unlike in >>>> Objective-C or C, enums are not typedefs of aliases for integers. >>>> >>>> enum Direction { >>>> case North >>>> case South >>>> case East >>>> case West } >>>> let myDirection = Direction.North >>>> >>>> Raw Value Enum (2:00) >>>> >>>> The second type of Swift enum is a "raw value" enum, which is the same >>>> as the basic enum but has additional raw values associated with each case. >>>> In this enum Title, each case has an associated string that is the name for >>>> the title. Important to note is that the raw value and the enum itself are >>>> not interchangeable. The toRaw and fromRaw methods help to go between the >>>> value and the enum. >>>> >>>> enum Title : String { >>>> case CEO = "Chief Executive Officer" >>>> case CTO = "Chief Technical Officer" >>>> case CFO = "Chief Financial Officer"} >>>> let myTitle = Title.CEO let myString : String = Title.CEO.toRaw() let >>>> anotherTitle : Title = >>>> Title.fromRaw("Chief Executive Officer")! >>>> >>>> For integer type raw enums, integer numbering remains implicit if you >>>> do not specify values. Swift automatically counts up from the last provided >>>> explicit value. This can be seen in the following example: >>>> >>>> enum Planet : Int { >>>> case Mercury = 1 >>>> case Venus, Earth, Mars // 2, 3, 4 >>>> case Jupiter = 100 >>>> case Saturn, Uranus, Neptune // 101, 102, 103 } >>>> >>>> Associated Value Enum (3:52) >>>> >>>> The third type of enum is one with associated values. Each case in the >>>> enum can carry associated data. In this example from the Swift book, the >>>> bar code enum allows you to associate different QR codes with different >>>> strings. >>>> >>>> enum Barcode { >>>> case UPCA(sys: Int, data: Int, check: Int) >>>> case QRCode(String) } >>>> let myUPC = >>>> Barcode.UPCA(sys: 0, data: 27917_01919, check: 2) let myQRCode = >>>> Barcode.QRCode("http://example.com") >>>> >>>> Associated values are especially useful in handling JSON, because >>>> arrays and dictionaries are actually types. Thus, you can create an enum to >>>> represent a JSON structure as a tree, with JSON nodes wrapping different >>>> types. >>>> >>>> enum JSONNode { >>>> case NullNode >>>> case StringNode(String) >>>> case NumberNode(Float) >>>> case BoolNode(Bool) >>>> case ArrayNode([JSONNode]) >>>> case ObjectNode([String:JSONNode]) } >>>> let x : JSONNode = .ArrayNode( >>>> [.NumberNode(10.0), >>>> .StringNode("hello"), >>>> .BoolNode(false)]) >>>> >>>> Switch Statements (Pattern Matching) (6:17) >>>> >>>> Switch statements is where most of the pattern matching functionality >>>> in Swift comes from. A basic switch statement looks very similar to an >>>> Objective-C switch statement, where there is a clause followed by cases. >>>> Two things to note: Swift switches don't have breaks, so for old style >>>> fallthrough behaviour, your code must have an explicit use of the keyword >>>> fallthrough. Switch statements must also be comprehensive, so default cases >>>> are required, which may help prevent errors. >>>> >>>> let value = 10switch value { case 10: println("ten") case 20: >>>> println("twenty") case 30: println("thirty") default: println("another >>>> number") } >>>> >>>> Ranges (8:35) >>>> >>>> In Swift, you can also pattern match on anything that's comparable. You >>>> can even match strings now to a case (and printout emojis for a fun parlor >>>> trick!). Anything that can be compared with the double equals operator can >>>> be matched. Swift also allows matching on ranges, where ranges can be the >>>> pattern inside a switch state. >>>> >>>> let v: UInt = 10switch v { case 0...9: println("Single digit") case >>>> 10...99: println("Double digits") case 100...999: println("Triple digits") >>>> default: println("4 or more digits") } >>>> >>>> Tuples (9:00) >>>> >>>> Tuples are composite data types - they contain multiple elements that >>>> can all be of different types. A tuple is then represented by the types of >>>> its elements. In this tuple-based switch statement, a tuple is the input. >>>> Each element in the pattern tuple is actually a sub-pattern, so you can >>>> match against patterns in each element. The underscore represents a "I >>>> don't care" value. In this example, the last case functions as a default >>>> because the (_, _) says the same thing as a default - none of the other >>>> cases match, and we don't care about other possible values. >>>> >>>> let person = ("Helen", 25) switch person { case ("Helen", let age): >>>> println("Your name is Helen, and you are \(age)" + " years old") case >>>> (_, 13...19): >>>> println("You are a teenager") case ("Bob", _): >>>> println("You are not a teenager, but your name" + " is Bob.") case (_, >>>> _): >>>> println("no comment") } >>>> >>>> Binding in Cases (10:56) >>>> >>>> If you have case statements, there may be associated data that needs to >>>> be used in the case statement body. The let binding is how you can do that. >>>> The first two cases in this example take the tuple elements and create the >>>> bindings X and Y to represent those elements. >>>> >>>> let myTuple = ("abcd", 1234) switch myTuple { case let (x, y): >>>> "The string in 'x' is \(x); " + "the integer in 'y' is \(y)"case (let x, >>>> let y): >>>> "Another way to do the exact same thing"case (_, let y): >>>> "We don't care about the string in 'x', " + "but the integer in 'y' is >>>> \(y)"} >>>> >>>> Enums (12:22) >>>> >>>> You can also switch on enums, but for enums with values wrapped inside, >>>> switch statements are the only way you can access those values. The >>>> following switch statement uses let to bind each case and use the value. >>>> >>>> enum ParseResult { >>>> case NumericValue(Int) >>>> case Error(String) } >>>> let a = ParseResult.NumericValue(1) switch a { case let .NumericValue(v): >>>> "Success; numeric value is \(v)"case .Error(let err): >>>> "Failed; error message is \(err)"} >>>> >>>> Types (13:20) >>>> >>>> The main type of switch is the type/sub-class pattern. If your switch >>>> conditional in this clause is a class, then class will have sub- or >>>> superclasses. In this example, the UIView is matched against the different >>>> possible types of views: UIImageView, UILabel, and UITableView. The "as" >>>> keyword differs from the "is" keyword in that "as" allows you to use the >>>> let binding and do something with myView, while "is" is used simply to >>>> check the type. >>>> >>>> let myView : UIView = getView() switch myView { case is UIImageView: >>>> println("It's an image view")case let lbl as UILabel: >>>> println("It's a label, with text \(lbl.text)") case let tv as >>>> UITableView: >>>> println("It's a table view, with"+ " \(tv.numberOfSections()) sections") >>>> default: >>>> println("It's some other type of view") } >>>> >>>> where clause (14:33) >>>> >>>> Another important thing about switch statements is the where cause. >>>> This clause can be added to any case and acts as a boolean expression that >>>> returns true or false. The case is then taken only if this where clause >>>> returns true. This switch example relies not on pattern matching but >>>> instead on these where clauses, following through with the case if myView >>>> is of a certain size or other characteristic. >>>> >>>> let myView : UIView = getView() switch myView { case _ where >>>> myView.frame.size.height < 50: >>>> println("Your view is shorter than 50 units") case _ where >>>> myView.frame.size.width > 20: >>>> println("Your view is at least 50 units tall," + " and is more than 20 >>>> units wide") case _ where >>>> myView.backgroundColor == UIColor.greenColor(): >>>> println("Your view is at least 50 units tall," + " at most 20 units >>>> wide, and is green.") default: >>>> println("I can't describe your view.") } >>>> >>>> Expression Operator (15:28) >>>> >>>> A final important feature in Swift is the expression operator. >>>> >>>> func ~=(pattern: Type1, value: Type2) -> Bool >>>> >>>> This operator takes the pattern and the value, and then uses pattern >>>> matching to return true or false. It can be overloaded as well to implement >>>> custom matching behaviour. The following piece of code is Swift pseudo-code >>>> to demonstrate what you could build. In an array four elements long, you >>>> could create cases that matched any combination of the elements. >>>> >>>> let myArray = [1, 2, 4, 3]switch myArray { case [..., 0, 0, 0]: >>>> doSomething()case [4, ...]: >>>> doSomething() case [_, 2, _, 4]: >>>> doSomething() case [_, _, 3, _]: >>>> doSomething() case [_, _, _, 3]: >>>> doSomething() default: >>>> doDefault() } >>>> >>>> Expression Patterns (17:42) >>>> >>>> The following extended example is a custom implementation of the >>>> pattern match operator. This custom operator turns the elements of an array >>>> into the enum values. >>>> >>>> enum WCEnum { >>>> case Wildcard >>>> case FromBeginning >>>> case ToEnd >>>> case Literal(Int) } >>>> func ~=(pattern: [WCEnum], value: [Int]) -> Bool { >>>> var ctr = 0 >>>> for currentPattern in pattern { >>>> if ctr >= value.count || ctr < 0 { return false } >>>> let currentValue = value[ctr] >>>> switch currentPattern { >>>> case .Wildcard: ctr++ >>>> case .FromBeginning where ctr == 0: >>>> ctr = (value.count - pattern.count + 1) >>>> case .FromBeginning: return false >>>> case .ToEnd: return true >>>> case .Literal(let v): >>>> if v != currentValue { return false } >>>> else { ctr++ } >>>> } >>>> } >>>> return true} >>>> >>>> Protocols (21:06) >>>> >>>> In order to understand generics, you have to understand protocols, >>>> which are something that existed in Objective-C as well. Protocols are >>>> basically a contract that can define nothing at all or any number of >>>> methods and properties. However, protocols can't have any implementation >>>> details - they can only have method signatures and property names. >>>> MyProtocol in this code defines just one property as requiring a getter and >>>> setter, as well as one method. >>>> >>>> protocol MyProtocol { >>>> var someProperty : Int { get set } >>>> func barFunc (x: Int, y: Int) -> String} >>>> >>>> Types can conform to none, one, or multiple protocols. Protocols can >>>> also inherit from other protocols, thereby getting all the parent >>>> protocol's methods and properties. >>>> Conformance (23:18) >>>> >>>> With protocols, you can make classes, structs, and enums conform to >>>> them. By making a type conform to a protocol, you are telling the compiler >>>> that your type will match the definitions set in the protocol. MyClass >>>> conforms to MyProtocol in providing implementations that match. >>>> >>>> class MyClass { >>>> // Nothing here... >>>> // This won't compile!} >>>> class MyClass : MyProtocol { >>>> var myProperty : Int = 0 >>>> // Property conformance >>>> func barFunc (x: Int, y: Int) -> String { >>>> return "\(x) + \(y) = \(x + y)" >>>> } >>>> var someProperty : Int { >>>> get { >>>> return myProperty >>>> } >>>> set { >>>> myProperty = newValue >>>> } >>>> } } >>>> >>>> Uses (24:06) >>>> >>>> There are a few reasons you may want to use protocols. The first reason >>>> is parent-child relationships, where you don't want all the children to >>>> have a specific class of a parent. For example, UITableView comes with >>>> Cocoa and is a list of objects that specifies the number and content of >>>> cells. For the delegate to provide that information, it just has to >>>> implement the protocol which has methods for the cells. This way, you can >>>> avoid specifying the delegate as a sub-class of a class. >>>> >>>> A second major use for protocols can be seen in the Swift Standard >>>> Library, where they add functionality to a type, piece by piece. Equatable, >>>> LogicValue, and AbsoluteValuable are all protocols that are implemented by >>>> different types in the library. The LogicValue protocol has a method that >>>> takes an object and turns it into true or false, so if you create a custom >>>> type and implement this protocol, you can use that type in an if >>>> statement's clause. >>>> >>>> One final use for protocols is to allow different types to be described >>>> by the same generic type parameter. For example, if you wanted to put >>>> different types into an array, you could give the objects a protocol and >>>> then declare the array with the protocol. You then have an array of >>>> equatables and anything that conforms to the equatable in that array can be >>>> added. >>>> >>>> protocol JSONType { } extension String : JSONType { } extension Float : >>>> JSONType { } extension Bool : JSONType { } extension Array : JSONType { } >>>> extension Dictionary : JSONType { } >>>> let b : Array<JSONType> = [10.1, 10.2, "foo"] let a : Array<JSONType> = >>>> [10.0, "bar", false, b] >>>> >>>> Generics (28:36) >>>> >>>> Generics did not exist in Objective-C. THey are basically the >>>> statically typed languages' answer to the flexibility of dynamically typed >>>> languages. Generics are used to allow you to use the same code for >>>> different types. The type parameter allows you to do this >>>> generically. >>>> >>>> func swapItems<T>(inout this: T, inout that: T) { >>>> let tempThis = this >>>> this = that >>>> that = tempThis } >>>> >>>> With generics, you can also enforce more constraints, as in the >>>> following example. The ": Equatable" allows you to constrain T to any type >>>> that conforms to Equatable, or is valid with the double equals operator. >>>> >>>> func firstAndLastAreEqual<T : Equatable> >>>> (someArray: Array<T>) -> Bool { >>>> let first = someArray[0] >>>> let last = someArray[someArray.count - 1] >>>> return first == last } >>>> >>>> You can also use generics for either functions or type declarations. >>>> Type information is available at runtime, which is helpful. The compiler >>>> can optimize by creating specific versions for each type that's being used >>>> (like C++ templates), but it can also fall back to the generic >>>> implementation. >>>> Extended Example (33:56) >>>> >>>> In the extended example, the goal was to create a function that was >>>> typesafe and could handle every case that involved the following types: >>>> Array, Dictionary, SquareMatrix, TreeNode. The function was to take a >>>> collection of one of the above types, take an array, and append the items >>>> in that collection to the array. >>>> >>>> A protocol was defined to specify that a type can give back all of the >>>> elements inside of it. You have containers that can implement >>>> "AllElements". On a generic level, you might need to know the type of the >>>> elements inside the collection, and so a wildcard is called "ElementType". >>>> And so, you specify the element type when you implement the function >>>> itself. >>>> >>>> protocol AllElements { >>>> typealias ElementType >>>> // Return an array containing all the objects >>>> // in the collection >>>> func allElements() -> Array<ElementType> } >>>> >>>> Another thing you can use is the NilLiteral protocol, the point of >>>> which is to take nil and turn it into something equivalent to nil in that >>>> type. For an int, it would return 0, or maybe for a string, it would return >>>> "". In the following example, you would want it to return something of type >>>> self. >>>> >>>> protocol NilLiteralConvertible { >>>> class func convertFromNilLiteral() -> Self} >>>> >>>> Extensions then add methods, computed properties, and protocol >>>> conformance to existing types. Array and SquareMatrix are both fairly >>>> straightforward - you just return the arrays themselves. For the >>>> Dictionary, you iterate through all the elements, create a buffer, and >>>> return it with the elements inside. Finally, for the tree, you go through >>>> the tree in a recursive traversal and again add the elements to a buffer. >>>> >>>> Put together, the final function appendToArray calls AllElements and >>>> gives "a", which is an array with all the elements on the source. Then each >>>> of those elements is just added to the array in "dest". This works because >>>> the generic argument "T" has to implement AllElements, and U has been >>>> constrained to the same type as T. The where clause is included in case you >>>> want to do more than have this type implement one protocol. Before the >>>> where, you declare type arguments, which can conform to either one or none >>>> protocols. If you want T to conform to 2+ protocols, add a "where" clause >>>> to constrain. You can then constrain any free type arguments you declared >>>> earlier and any associated types associated with the type arguments via >>>> protocols (e.g. T.SomeType). >>>> >>>> func appendToArray >>>> <T: AllElements, U where U == T.ElementType> >>>> (source: T, inout dest: Array<U>) { >>>> >>>> let a = source.allElements() >>>> for element in a { >>>> dest.append(element) >>>> } } >>>> var buffer = ["a", "b", "c"] appendToArray([1: "foo", 2: "bar"], &buffer) >>>> >>>> Now you've created five methods for this one process. In actuality, you >>>> would have your containers implement Sequence and use a for-in loop to go >>>> through all the elements. This requires knowledge of Generators, >>>> EnumerateGenerators, and other material. >>>> Q&A (46:05) >>>> >>>> *Q: In the extension example, are we extending all arrays of anything?* >>>> Austin: Yes, which is why this is a bad idea in practice. You can't >>>> actually say that you only want arrays with JSON type objects to also >>>> implement JSON array, which is needed to ensure that you have valid JSON. >>>> >>>> *Q: Is the type T built-in? Where does it come from?* >>>> Austin: T is actually coming from the declaration of array. If you >>>> command-click an array in XCode, the declaration of the array shows that it >>>> declares a generic argument T that has some constraints. >>>> >>>> *Q: Is there any kind of trace for generics and the way it works? Is it >>>> traceable to an existing language or is it brand-new?* >>>> Austin: I don't know the answer, but I'm sure there are precedents. >>>> Generics in Swift kind of de-emphasize object oriented programming because >>>> they're built more around protocols than around class hierarchies. You >>>> might get a closer procedent if you looked at Haskell. >>>> >>>> *Q: What is the exclamation point used for?* >>>> Austin: The exclamation mark is for optionals. Everything in Swift is >>>> non-nilable by default, so if you want to set something to nil, it must be >>>> declared as an optional. The question mark after the type signifies this. >>>> Then, the exclamation mark, or bang, takes the value out of the optional so >>>> you can use it. >>>> >>>> *Q: Is there something like value template parameters in Swift? Or >>>> should we just type in, type template?* >>>> Austin: I don't think so, I don't think Swift generics are as powerful. >>>> >>>> *Q: Can you explain let? It seemed like it would sometimes check the >>>> case and othertimes it would set it to the constant.* >>>> Austin: A let pattern kind of matches everything, but also takes a >>>> value and puts it in the constant for later use. When we use "as", it both >>>> checks the type and also puts it in the constant. >>>> ------------------------------ >>>> Sign up to be notified of future videos >>>> >>>> We won't email you for any other reason, ever. >>>> >>>> >>>> -- >>>> Recebeu esta mensagem porque subscreveu ao grupo "Mailing List da >>>> Comunidade Portuguesa de Rich Internet Applications - www.riapt.org" >>>> do Grupos do Google. >>>> Para anular a subscrição deste grupo e parar de receber emails do >>>> mesmo, envie um email para [email protected]. >>>> Para publicar uma mensagem neste grupo, envie um email para >>>> [email protected]. >>>> Visite este grupo em http://groups.google.com/group/riapt. >>>> Para mais opções, visite https://groups.google.com/d/optout. >>>> >>> >>> >>> -- >>> Recebeu esta mensagem porque subscreveu ao grupo "Mailing List da >>> Comunidade Portuguesa de Rich Internet Applications - www.riapt.org" do >>> Grupos do Google. >>> Para anular a subscrição deste grupo e parar de receber emails do mesmo, >>> envie um email para [email protected]. >>> Para publicar uma mensagem neste grupo, envie um email para >>> [email protected]. >>> Visite este grupo em http://groups.google.com/group/riapt. >>> Para mais opções, visite https://groups.google.com/d/optout. >>> >>> >>> -- >>> Recebeu esta mensagem porque subscreveu ao grupo "Mailing List da >>> Comunidade Portuguesa de Rich Internet Applications - www.riapt.org" do >>> Grupos do Google. >>> Para anular a subscrição deste grupo e parar de receber emails do mesmo, >>> envie um email para [email protected]. >>> Para publicar uma mensagem neste grupo, envie um email para >>> [email protected]. >>> Visite este grupo em http://groups.google.com/group/riapt. >>> Para mais opções, visite https://groups.google.com/d/optout. >>> >> >> >> -- >> Recebeu esta mensagem porque subscreveu ao grupo "Mailing List da >> Comunidade Portuguesa de Rich Internet Applications - www.riapt.org" do >> Grupos do Google. >> Para anular a subscrição deste grupo e parar de receber emails do mesmo, >> envie um email para [email protected]. >> Para publicar uma mensagem neste grupo, envie um email para >> [email protected]. >> Visite este grupo em http://groups.google.com/group/riapt. >> Para mais opções, visite https://groups.google.com/d/optout. >> >> >> -- >> Recebeu esta mensagem porque subscreveu ao grupo "Mailing List da >> Comunidade Portuguesa de Rich Internet Applications - www.riapt.org" do >> Grupos do Google. >> Para anular a subscrição deste grupo e parar de receber emails do mesmo, >> envie um email para [email protected]. >> Para publicar uma mensagem neste grupo, envie um email para >> [email protected]. >> Visite este grupo em http://groups.google.com/group/riapt. >> Para mais opções, visite https://groups.google.com/d/optout. >> > > -- > Recebeu esta mensagem porque subscreveu ao grupo "Mailing List da > Comunidade Portuguesa de Rich Internet Applications - www.riapt.org" do > Grupos do Google. > Para anular a subscrição deste grupo e parar de receber emails do mesmo, > envie um email para [email protected]. > Para publicar uma mensagem neste grupo, envie um email para > [email protected]. > Visite este grupo em http://groups.google.com/group/riapt. > Para mais opções, visite https://groups.google.com/d/optout. > > -- > Recebeu esta mensagem porque subscreveu ao grupo "Mailing List da > Comunidade Portuguesa de Rich Internet Applications - www.riapt.org" do > Grupos do Google. > Para anular a subscrição deste grupo e parar de receber emails do mesmo, > envie um email para [email protected]. > Para publicar uma mensagem neste grupo, envie um email para > [email protected]. > Visite este grupo em http://groups.google.com/group/riapt. > Para mais opções, visite https://groups.google.com/d/optout. > -- Recebeu esta mensagem porque está inscrito no grupo "Mailing List da Comunidade Portuguesa de Rich Internet Applications - www.riapt.org" dos Grupos do Google. Para anular a subscrição deste grupo e parar de receber emails do mesmo, envie um email para [email protected]. Para publicar uma mensagem neste grupo, envie um e-mail para [email protected]. Visite este grupo em http://groups.google.com/group/riapt. Para mais opções, consulte https://groups.google.com/d/optout.
