Tuesday, December 24, 2013

Clojure vs Scala

Last week, someone posted a question on the Clojure group asking for a comparison between Clojure and Scala. Since my most popular blog post, by far, is my Racket vs Clojure post from three years ago, I thought it would be good to post my response here.

Ten years ago, I would have said that my ideal dream language is one that provides the flexibility to program in any style. I want to be able to choose object-oriented or functional, immutable or mutable, high-level abstractions or low-level speed. With respect to this ideal, Scala clearly wins, supporting more programming styles than Clojure.

I've definitely changed my tune, though, and now I actually prefer the way that Clojure constrains and shapes my thinking. I argue that even though Scala may provide me with more options on how to tackle a given programming problem, Clojure guides me towards a simpler solution. If this intrigues you, read on...

The following text is only slightly paraphrased from what I posted to the group:

All or nearly all of the functional aspects of Clojure have counterparts in Scala. On top of that, Scala provides mutable flavors of everything, so you can pick and choose your approach. So that makes Scala better, right?

But the difference between Clojure and Scala is bigger than a feature-to-feature comparison -- they have very different philosophies, and programs developed in Clojure consequently have a very different feel to them than those developed in Scala. I find Clojure programs to be dramatically simpler.

Just as one example, consider modeling a deck of cards. In Clojure, you'd be more likely to come up with a simple representation for a card, perhaps: [10 :spades]. Depending on the card game, you might choose to represent a face card as [:king :clubs] or [13 :clubs]. A deck would likely be modeled as just a sequence of cards, and all the built-in sequence functions would apply, for example, shuffle, take, drop, etc. Serializing the data (for example, if you want to keep a database tracking all the shuffled decks you've ever used in a given game) comes for free.

On the other hand, in Scala, you'd be more likely to create a card Class with a rank and suit field. The Suit class would be comprised of four case classes, because the philosophy is to enumerate all the possible suits as separate entities -- there's nothing in Scala like Clojure's convenient keywords. For the rank, you'd be steered towards representing all the ranks as integers. The possibility of representing face cards with a name would likely never occur to you, because it would be too complicated to go through the effort of defining the type of a rank to be a "integer or a class comprised of four case classes -- jack,queen,king,ace". For modeling the deck, you probably wouldn't say a Deck is-a sequence, because composition is favored over inheritance. So you'd probably have a Deck class which would contain a sequence of cards. This means that you'd have to reimplement methods like shuffle, take, and drop on your Deck class to turn around and dispatch those methods to the underlying sequence of cards. If you're not careful, years of object-oriented training might kick in and before you know it, you're representing the deck as a class where methods like shuffle, take, and drop destructively update the underlying sequence -- it feels so natural to do that once you've encapsulated the underlying sequence of cards in a class. If you want to serialize a deck, that's more code to write (although general "pickling" of a Scala object is an active area of research).

This example pretty much sums up what I prefer about Clojure. I like to tell people that a big part of what makes Clojure special is its philosophy of lightweight data modeling. It leads to delightfully simple systems. Scala remains deeply rooted in the OO philosophy, which all too often leads to an over-engineered muddle.

Further thoughts

After posting the above message, a couple people pointed out that Scala doesn't force you to build the more complicated model. That's absolutely true. But due to its highly detailed static type system, Scala attracts the kind of programmers that like to carefully categorize and enumerate all the possible data structures that will occur in their programs. Sure, you could eschew objects in Scala and mimic Clojure by using generic maps/vectors/lists/sets for all your structured data needs, but that's clearly not how Scala is meant to be used, and numerous little details of the language psychologically steer you towards developing a more rigorous type taxonomy.

In my post, I mentioned lightweight data modeling. I can't stress this term enough. I'd like to see it become the new catchphrase for Clojure. When I used to give my "elevator pitch" for Clojure, I'd talk about how it was a functional programming language, a dialect of Lisp on the JVM, with some interesting concurrency constructs. I'd get a lot of blank stares. Most people don't know what it means to be functional, and many don't know about Lisp. But once I started talking about lightweight data modeling, people's interest perked up. People get it, or think they get it, or at least get it enough to be curious to ask for more details.

At that point, I often say something like, "Do you know JSON?" After getting acknowledgment, I continue with, "Well, imagine if you could represent all your data as JSON, rather than a complex hierarchy of objects and methods, and the language was designed around making that kind of data super-easy to work with." I find I get a much more positive response from this kind of explanation. It gives a hint of what it feels like to work in Clojure and think in Clojure.

I find it interesting that in Scala's early days, Scala had a similar orientation. They proudly boasted that XML manipulation was going to be Scala's killer feature. You could drop XML in your code as a data literal; the language was oriented around making XML easy to work with. Now, this has fallen by the wayside. Martin Odersky (the designer of Scala) has been quoted as saying, "Seemed a great idea at the time, now it sticks out like a sore thumb."

I admit, there are times where I'm envious of Scala's versatility versus Clojure: the ease of using a mutable variable, the ease of working with Java primitives and arrays, the speed that comes from static typing, the richness of classes versus Clojure's namespaces. (Actually, this last point is probably worthy of its own blog post -- Clojure's namespaces are quite limited in ways that frequently cause me pain). Whenever I run up against one of these rough spots in Clojure, I feel like an ascetic monk, suffering because I've chosen to deny myself the additional tools that Scala brings to the table. But overall, I feel happier programming in Clojure because the additional constraints imposed by Clojure guide me more quickly towards a simple design.

128 comments:

  1. Years ago it was called "symbolic programming" and it's still as useful.

    ReplyDelete
    Replies
    1. Thoughts On Programming: Clojure Vs Scala >>>>> Download Now

      >>>>> Download Full

      Thoughts On Programming: Clojure Vs Scala >>>>> Download LINK

      >>>>> Download Now

      Thoughts On Programming: Clojure Vs Scala >>>>> Download Full

      >>>>> Download LINK ws

      Delete
  2. In Scala I would model a card as an Int and a card type either Face or King, Jack, Queen, Ace. I would use case classes giving pattern matching, Scala picking gives serialisation for free and easy and type checking for the serialisation at compile time.

    trait CardType
    case class FaceCard() extends CardType
    case class QueenCard() extends CardType
    case class... the other types continued... then
    case class Card(cardValue: Int, cardType: CardType)

    A deck of cards would be a single class which would contain a collection of cards, a List[Card], operations shuffle, etc, would be defined on the Deck class. Operations such as shuffle would produce a new immutable Card class instance, so there would be no mutable state, rely on the immutable List data structure.

    In particular since the Deck class is immutable you could expose the internal list publicly so people could do any of the take drop operations on the internal list and still be assured that the code is safe, pure functional and immutable. There is no need to hide the internal list implementation, so all list operations are available.

    I would say the main difference is that Scala doesn't have some features baked into the language that Clojure has, however, those features are available if you bring in the right libraries. So the language grows by convention, by the libraries, rather than having those things in at the beginning.
    It would be nice if those things were in at the beginning, but it would be a big job to put all of them in!

    A good example is Picking, which is new, but it gives easy and fast serialisation of Scala objects, this is not a part of the language but a library which uses Scala macros to do type safe serialisation, ie, it gets type checked at compile time, and some runtime checks.

    ReplyDelete
    Replies
    1. Just to show how you could use a deck, if you wanted to find all queens in a deck.

      val queenCardsInDeck = deck.cards.filter(_.cardType == QueenCard)

      To find cards with values < 5

      val valuesLessThanFive = deck.cards.filter(_.cardValue < 5)

      To pattern match.

      card match {
      case Card(_,QueenCard) => { println("This is a queen") }
      case Card(_,KingCard) => { println("This is a king") }
      }

      Delete
    2. Small correction "s such as shuffle would produce a new immutable Card class instance" should say "new immutable Deck class"

      Delete
    3. Phil, do I need to have Picking on the receiving side to deserialise the data? What if I use another language, are there any Picking-compatible deserialisers around? Are there any APIs that accept Picking-serialised data? Are there any databases that understand Picking serialisation format and can create efficient index to query the data?

      I hope you see my point. Type safety is great, but your application is usually a tiny piece of software in the much greater world that doesn't give a damn about your cool type system :)

      Delete
    4. Scala's [currently experimental] Pickling does allow you to change the output format easily, so there is an arbitrary number of "language-independent pickling-deserializers" around, depending on what output format the developer choose. (Clojure would of course run into the same kind of challenge when talking with other platforms. The author's point, as far as I gather, is that there is no such obfuscation of unfamiliarity *inside* a Clojure-application, when using a map to represent a deck of cards rather than a custom data type.)

      That being said, I do think phil's post goes some length to prove the points of this blog post. And THAT being said, I do love programming in Scala :)

      Delete
    5. (https://github.com/scala/pickling)

      Delete
    6. JSON test fixtures looks very promising, but there already are several limitations:

      1. Everything is wrapped with JSONPickle(...)
      2. Some JSON properties (e.g. "tpe", "$ref", "elems", "value") have special meanings, which means they can't be used for anything else.

      Although it is technically JSON data, it can't be used to talk to any Pickling-unaware API. It seems to be a fundamental limitation: you can't preserve all the semantics of Scala without loosing format generality. JSON and similar serialisation formats work as the lowest common denominator which everybody understands. Those who have richer semantics in their languages will be forced to somehow encode them to restore in future.

      At the moment Scala application I'm writing looks like series of type transformations JSON <-> JSON parser types <-> case classes <-> [Some application logic] <-> case classes <-> ORM types <-> DB native type system. App logic is slim compared to dances around types. Maybe it will change in future, but at the moment it looks like waste of time.

      Clojure's native data types are much closer to JSON and relational tuples, so less transformations are needed.

      Delete
    7. Yes, pickling is a specialized form of serialization+deserialization which lets you retain concrete instance types. This is the central idea about pickling and what differentiates it from serialization/deserialization. I agree that if you don't need this information, then you are better off using a serializer for your format of choice.

      If what you are saying is "Clojure has native data structures and literals for these, much like JavaScript" then yes, that's hard to disagree with :) But I don't agree that Clojure's data types are more similar to JavaScript's than, for example, Scala's.

      Deserializing JSON to Clojure data types would consist of the same steps as Scala, save for custom type providers which are not necessary/possible. Platform-specific data types such as Ratio, Vector/List etc would also be lost in the process, unless a Clojure-specific format (and matching "pickler") was used.

      Delete
    8. Alexander Zolotko and Mar - Picking serializes to JSON or Binary at this moment, currently I use it to serialize to JSON files.

      As the website says "can be Language-Neutral if you want it to be. Changing the format of your serialized data is as easy as importing the correct implicit pickle format into scope. Out of the box, we currently support a fast Scala binary format, as well as JSON. Support is currently planned for other formats. Or, you can even roll your own custom pickle format!".

      Delete
    9. Alexander, you can change the format of the JSON serialization very easily!

      Delete
  3. This is a great write up and echos conversations I have had with other scala and clojure developers. And as I read it I found myself agreeing with you that had I wrote this in scala I would be steered psychologically towards the OO approach. But as a counter example - what if I didn't like the shuffle algorithm provided by clojure sequences? (Disclaimer: I have never used clojure, just read about it here and there). What if I want to do other things when drop or take is called? The OO approach always seems like overkill plumbing if all you are doing is putting a facade over an existing datatype - but you're putting a contextual facade over that datatype - leaving out methods that don't apply to a deck of cards and allowing you to do more than just the underlying data types actions. Are there actions you can do on a sequence in clojure that don't apply to a deck of cards or that you wouldn't want someone to be able to do? Python has a similar mindset - don't keep the programmer from doing something dumb programmatically - its up to them to know what they're doing. Thats great for rapid development in a team thats all about the same skill level - but I think there are places where an OO approach is more applicable. What do you think?

    ReplyDelete
  4. > the speed that comes from static typing

    Is this really an advantage? I thought the speed advantage Scala programs sometimes exhibit over Clojure programs just comes from the reduced reluctance to use destructive updates.

    I haven't used static types on the JVM, but from talking to people who use it, they seem to care more about offering correctness guarantees than speed. Static types certainly get a speed boost over Groovy or JRuby programs which usually rely heavily on reflection, but this is rarely true (and easy to avoid) in Clojure programs.

    ReplyDelete
  5. You've got a very good point there, and to an extent I'll agree with you.

    But.

    There is at least one pitfall that goes along with what you call "lightweight data modelling" (great term, by the way): An excessive fascination with the representation of data, as opposed to its structure. It hit me hard a while back when I was reading Land of Lisp and found the first function from my blog post. So, I came up with a modified version of the program that uses the second function---they do exactly the same task.

    I realize that the second version is somewhat more verbose and that you don't have any context to understand what it's doing (which is not helped at all by the fact that I kept the same function names---they're fiddling with game search trees). But I submit that the second might be preferable anyway.

    A compulsion to over-model every thing in sight is one of the major sins of object-oriented programming, and I get to struggle with it quite a lot at work lately. And my personal feeling is that Scala's syncretism is rapidly heading towards Perl's write-only-ness---it certainly doesn't seem to be guiding anyone to the simplest solutions. But going too far the other way isn't going to be any better.

    ReplyDelete
  6. Actually, there _is_ something in Scala like clojure's convenient keywords: symbols. They just don't get much use (outside the compiler itself).

    ReplyDelete
    Replies
    1. They don't get used at all (that I can think of) in the compiler itself. The thing called "Symbol" in the compiler has no relationship.

      Delete
  7. You don't need to create a whole new class for a Deck. I would model it as:

    sealed trait Suit
    case object Spades extends Suit
    case object Clubs extends Suit
    case object Hearts extends Suit
    case object Diamonds extends Suit
    type Deck = List[(Int, Suit)]

    This construct, acting like a type alias in this case, makes it easy for you to change Deck to a class if needed later. You shouldn't need it though, as you can add any extra methods to your Deck through extension methods.

    ReplyDelete
    Replies
    1. Exactly.

      And if you google "scala deck of cards" and look at what people do, "over-modeling" doesn't seem to be an issue. (One solution appears to be inspired more by "C" than Java, but again, "over-modeled" it ain't).

      The scala community is definitely heterogenous but baroque object models are pretty generally frowned upon in my experience.

      Delete
  8. The problem is that both approaches have their pros and cons. The "clojure" approach is the dynamic approach. What a (good) python/perl/... programmer would do. The "scala" approach is the general approach a (good) Java/C++/... programmer would take. And you're right, for simple operations the dynamic approach would be best, simply because lots of operations are loosely defined because you're using very basic classes.

    However when the data becomes more complex, all these functions start to have side effects. There are plenty of lists you can't "take" from random places, shuffle may not be possible for the datastructure you've implemented. God forbid the list is a list that actually exists in a remote database.

    So the problem here is small versus large programs. The dynamic approach you describe is unbeatable for small programs, and a complete disaster for large ones. You implicitly apply a large, very-high-up class to your data and lots of stuff just works.

    When your program grows you're going to find that it doesn't always do the right thing and you need to either:

    1) reimplement the semantic equivalents of take, shuffle, and give them some weird name. Then live with the fact that anybody in your team can just call the wrong functions and you'd never find it.

    2) switch to the Scala static approach.

    ReplyDelete
    Replies
    1. Large programs almost always end up in complete disaster, compile times and the time tests take to run slowly creep up until maintenance and adding new features becomes a nightmare.

      Refactoring should be done at an application level as well to ensure programs stay small, it shouldn't matter which language they are written in.

      Better to keep programs small, pick the right language for the job, continually refactor, and focus on end to end tests so components can be easily replaced.

      Delete
  9. Integers would be a great starting point and they could represent everything that you need as long as you are OK with codifying the constraints in a function.

    ReplyDelete
  10. Great post however it tends to describe Scala as an OOP programming language which is not totally correct. The way to model the problem described for Scala is not the most popular way, of course if you come from a Java background this is what you tend to do but if you know ad hoc polimorfism, Monads etc... you would use a totally different approach, for example a deck would never be a new class but simply:
    type Deck = List[Cards]
    val deck:Deck = Deck(...)

    ReplyDelete
  11. Thank you for sharing such a nice and interesting blog with us. I have seen that all will say the same thing repeatedly. But in your blog, I had a chance to get some useful and unique information.

    Digital Marketing Training In Hyderabad
    sem training in hyderabad
    seo training in hyderabad
    SMM Training In Hyderabad

    ReplyDelete

  12. Cannabis, also known as marijuana among other names, is a psychoactive drug from the Cannabis plant used for medical or recreational purposes. The main psychoactive

    part of cannabis is tetrahydrocannabinol, one of the 483 known compounds in the plant, including at least 65 other cannabinoids

    buy real weed online
    buy edibles
    order cannabis edibles
    buy recreational weed online
    order cbd edibles online
    buy cbd hemp oil
    buy medical weed online
    buy dank vapes cartridges
    buy brass knuckles
    buy mario carts
    buy weed online without medical card
    buy cannabis seeds online
    buy OG kush
    buy sour diesel weed online
    buy moonrocks
    hybrid strains
    indica strains

    ReplyDelete
  13. Marijuana—also called weed, herb, pot, grass, bud, ganja, Mary Jane, and a vast number of other slang terms—is a greenish-gray mixture of the dried flowers of Cannabis sativa.

    The main active chemical in marijuana is THC (delta-9-tetrahydrocannabinol), the psychoactive ingredient. The highest concentrations of THC are found in the dried flowers, or buds. When marijuana smoke is inhaled, THC rapidly passes from the lungs into the bloodstream and is carried to the brain and other organs throughout the body. THC from the marijuana acts on specific receptors in the brain, called cannabinoid receptors, starting off a chain of cellular reactions that finally lead to the euphoria, or "high" that users experience. Feeling of a relaxed state, euphoria, and an enhanced sensory perception may occur. With higher THC levels in those who are not used to the effects, some people may feel anxious, paranoid, or have a panic attack.
    Cannabis plant used for medical or recreational purposes. The main psychoactive part of cannabis is tetrahydrocannabinol, one of the 483 known compounds in the plant, including at least 65 other cannabinoids. 
    buy real weed online
    how to buy weed online
    buy legal weed online
    buy recreational weed online
    buy weed edibles online
    can i buy weed online
    buy medical weed online
    buy weed online canada
    buying weed online reviews
    buy weed online legit
    buy weed online without medical card
    buy weed seeds online canada
    order marijuana online
    order marijuana seeds online
    how to order marijuana online
    order marijuana online without a medical card
    can you order medical marijuana online
    order marijuana online

    ReplyDelete
  14. The recent decision by the fda to ban juul pods and other juul accessories and juul devices such as juul wraps , juul skins .As matter of fact, not just juul pods where banned, juul flavors such as mango juul pods ,juul mango pods, mint juul pods ,mint juul creme brulee juul pods where part of the juul pods flavors banned by the fda before the complete ban on juul came up some few weeks back.But people still search for juul pods for sale,buy juul pods online,mango juul pods for sale,mint juul pods for sale.This has greatly affected the
    buy weed for online or marijuana for sale industry since people have seek for refuge in the
    buy weed online firms now.Girls eager to gain weight have shy away from juul pods and now concentrated on apetamin vitamin syrups.They consume apetamin and apetamin vitamin syrup since they no longer need to norm any part of the body because ketamine or ketamine hcl is in action.

    ReplyDelete
  15. We are a group of unique experts who manufacture real and fake passports , IDs,driver’s licenses  and other documents proving your identity or qualification. shrooms for sale online .
    We have many years of experience in this field that’s why you can be absolutely sure that no matter what you order from us, you will always receive a high-quality document that meets the necessary standards and requirements.Being the unique producers of bothreal and fake documents , we can make such travel and identity Visas,ID cards , Resident Permitsdocuments as Passports,  Driver’s Licenses and Birth certificates,IELTS Certificates,Social Security Number . Besides, you can order some other documents such as Buy Real Passports Online,Buy Fake Passport Online,Buy Real ID Cards,Buy Real Driver’s License,Resident Permits Application,IELTS, TOEFL Certificates For Sale   and others.
    our other companies include mango juul the CBD Oilfor sale Online firms have great taste too with cbd tinctures , ketamine hcl is in action. apetamin vitamin syrup , buy weed online
    Fake Money for Sale,Buy Undetectable Money Bills weed for sale
    Do you want to buy counterfeit money,fake notes for sale that looks real with Great Prices and Highest Quality ? Here is your chance to purchase Class A Prop and Replica Bank notes? . With over a billion of our products circulating around the world, we offer only original high quality COUNTERFEIT currencies and fake documents .Shipping from Ukraine and UK. you can click  here to read more

    ReplyDelete

  16. Hello, I have gone through your post Its really awesome.Thats a great article. I am also want to share about python online training and online python course.thank you

    ReplyDelete
  17. Mango juul
    The recent decision by the fda to ban juul pods , juul mint pods Bulk juul pods Mint juul pods for sale , Mango juul and other juul accessories and juul devices such as juul wraps , juul skins .As matter of fact, not just juul pods where banned, juul flavors such as mango juul pods ,juul mango pods, mint juul pods , mint juul creme brulee juul pods where part of the juul pods flavors banned by the fda before the complete ban on juul came up some few weeks back.But people still search for juul pods for sale , buy juul pods online , mango juul pods for sale , mint juul pods for sale .This has greatly affected the juul pods , juul , Mint juul , Juul starter kits , Juul skins , Mango juul pods for sale . Creme juul pods
    Mint juul pods , Creme Brulee juul pods
    buy weed online or marijuana for sale industry since people have seek for refuge in the creme brulee juul pods , creme brulee pods , Mango juul pods , juul mango pods , Mint juul Mango juul
    buy weed online firms now.Girls eager to gain weight have shy away from juul pods and now concentrated on apetamin vitamin syrups.They consume apetamin and apetamin vitamin syrup since they no longer need to norm any part of the body because ketamine or ketamine hcl is in action.



    ReplyDelete
  18. Established in 2013, we have Steadily proven to be one of the most Reputable and Reliable parrots Farm Nationwide. We are well know for having the best and healthiest macaw parrots nationwide.All the Macaw Parrots listed above are currently available at https://macawparrotsfarm.com/ . You can equally buy Blue and gold macaw for sale both babies and adults well trained, macaw parrots for sale They are able to interact with their keepers on many levels and quickly learn tricks then the macaws for sale have a daunting presence and formidable beaks. parrots for sale are are not only wonderful as pets, but make great show birds and the macaw for sale have a daunting presence and formidable beaks, they are highly intelligent. Hanhs macaw for sale, these stunning birds show exquisite control, selectively using their powerful beaks with finesse. Get your macaws from MACAW PARROTS FARM
    Call or text US +1 (909) 276-5604

    ReplyDelete
  19. buy hash online
    buy mdma online
    buy magic mushrooms
    where to buy dmt online
    order dmt online
    where to buy mdma
    where to buy shrooms
    buy marijuana oils online
    buy cbd oils online
    buy thc oils online
    buy lsd online
    buy cocaine online

    https://mypsychedoutshop.com/
    At Mypsychedout Shop
    We offer MDMA,DMT,MUSHROOMS,MARIJUANA OILS,HASH,LSD and more
    Order with us and get the best of your medications
    Buy dmt online,Buy magic mushrooms online,Buy mdma online,Buy dmt online

    ReplyDelete
  20. Finding a Juul Pods seller is getting more and more difficult as the Juul vape pod becomes more popular. Juul pods and Juul Pod Shops are always in high demand.

    ReplyDelete
  21. The recent collection of vital info gathered all round the globe on cetain great stories and products such as thos listed below will amaze you. what will you say about that n95 respirator
    pax era cbd pods glock store zastava ez9 for sale panzer arms bp-12 Mint juul pods weed for sale weed for sale juul pods Marijuana for sale

    ReplyDelete
  22. buy exotic carts online
    Buy Cannabis Oil
    glo extracts carts
    Buy cali tins online
    buy kush online
    buy marijuana online
    Vape Pen Oil Cartridges
    Buy vape cartridges from usa
    buy weed online
    Buy vape cartridges in bulk
    https://www.marijuanaskiesdispensary.com/
    Marijuana Skies Dispensary is an online marijuana store (We don’t do Walkins) based in USA,
    owned and controlled by a group of dedicated weed growers and enthusiasts from USA.
    The company was created to ensure our fast growing customer base gets easy access to
    the best weed supply across the globe.
    Best Place to Buy weed Online 2020
    100% safe and secure shipping worldwide within 2-3days.
    we work 24/7 just to satisfy our clients. We're Legit

    ReplyDelete
  23. Guns For Sale Near Me-Guns for sale The recent Bills passed by the senates on guns for sale have made alot of impact on guns for sale near me and other used guns for sale especially guns for sale in iowa,airsoft guns for sale and guns for sale in las vegas is causing controversy on guns for sale online.People are asking more info and wanting to know where to buy guns online and shave them shipped worldwide with pressure or fear,Reddit guns for sale and hand guns for sale especially hand guns for sale or guns for sale in florida alongside c&r guns for sale,paintball guns for sale,surplus guns for sale,cheap guns for sale are now the top talking point on all media house.My point on certain guns like the long guns,hand guns,,tatto guns for sale,rubber bullet guns,millitary surplus guns,auto guns for sale,nerf guns for sale at target should be made legal because we need to protect and guid our families and bussinesses with our Hand Guns. juul pods , juul pods . pax era pods , pax era , pax era pods near me ,n95 respirator ,surgical face mask for sale,face mask for sale

    ReplyDelete

  24. buy iboga online
    buy mushrooms online
    buy Ayahuasca online
    buy kratom online
    buy iboga online
    buy mushrooms online
    buy Ayahuasca online
    buy kratom online
    buy iboga online
    buy mushrooms online

    https://bestherbshops.com/
    Buy mushroom-buy ayahuasca-buy kratom-buy legit ibogaine online USA
    At Bestherbshops We're a newly form company so assist you with products you need like
    Iboga,Ayahuasca,Mushrooms,Kratom
    We work 24/7 and we're legit. Free shipping.

    ReplyDelete
  25. Years ago it was called "symbolic programming" and it's still as useful.
    farmhouse lumbar pillow
    personalized christmas ornaments

    ReplyDelete
  26. 420leafedincannabis.com
    .
    We are the most legit cannabis dispensary with both wholesale and retail weed for sale. Marijuana extract and thc cartridges are also available. We deliver in almost all states in the US and Puerto Rico. We are available in Canada, UK, USA, South America, Europe and Australia

    marijuana extracts

    cartridges

    sativa strains

    spacemonkeymeds for sale

    pre rolls for sale

    indica strains for sale online

    Buy edibles online

    cbd oil online

    Buy vape pens online

    Buy wax online

    Buy hybrid strains online

    Buy moonrocks online

    Buy carts with Bitcoin online

    cannabis products for sale

    sour diesel online
    buy hash online // www.psychedelicsdelivery.com
    buy edibles online // www.psychedelicsdelivery.com

    ReplyDelete
  27. Thanks a lot for sharing .

    Did you know ? Pomsky is a designer breed of dog that is a hybrid of the Pomeranian and the Siberian Husky. Adorable Pomsky puppies have attracted a lot of attention recently and made them one of the most popular breeds of 2017.
    Best Online Pet Adoption : Cavapoo Puppies For Sale : Australian Shepherd Puppies Below $200 : Available Maltipoo Puppies Online : Where To Buy Golden Retriever Puppies Online

    ReplyDelete
  28. I really like your blog. It helped me a lot. Entire details were given with easy to understand words. I wish you the best of luck for your future endeavors! If you’re troubling with HP wireless printer problems, you can call our printer technicians immediately. Our printer experts are available 24/7 to help you remotely.

    ReplyDelete
  29. Really amazing information, thanks for your efforts for this blog. Many thanks for sharing this excellent post, very useful & informative. If you have any queries during the Activate roku tv, then better call the Roku support team and explain your problem, they will provide the finest solutions for all the problems you face with the Roku player.

    ReplyDelete
  30. WE ARE SPECIALIZE WITH SCOTTISH FOLD MUNCHKIN KITTENS / CATS FOR SALE , SCOTTISH FOLD KITTENS/ CATS
    All my Scottish Fold Kittens are

    raised in my home. We breed selectively for temperament and health and beauty. We offer adorable Scottish fold munchkin kittens and

    Scottish fold kittens colors including white, blue, cream, red, silver, cameo, brown, Colico, chinchilla, blue-cream, tortoiseshell,

    black etc. They also can have different patterns like a solid color, tortoiseshell, tricolor/calico, bicolor, tabby, ticking, smoke,

    shaded and spots. Most of my Scottish Fold munchkin kittens are Registered with CAF / TICA


    scottish fold munchkin kittens for sale



    scottish fold cat for sale



    scottish fold kittens



    munchkin cat for sale


    scottish fold cats



    munchkin kittens for sale


    scottish fold munchkin


    scottish fold kittens for sale



    scottish fold kitten



    cat breeders near me



    munchkin cat price



    scottish fold cat for sale



    scottish fold munchkin cat



    scottish fold price



    munchkin cats for sale



    midget cats


    scottish fold breeders


    scottish fold longhair


    cat health issues


    munchkin cat lifespan

    scottish fold rescue

    short leg cat

    how much does a scottish fold cat cost

    scottish fold personality

    ReplyDelete
  31. buy weed in bulk USA, UK, Canada, Australia and Germany
    Best Marijuana Dispensary Online also known as 420 Marijuana Thrives among other names, is a psychoactive drug dispensary from the Cannabis plant used primarily for medical or recreational purposes. The main psychoactive component of cannabis is tetrahydrocannabinol (THC), which is one of the 483 known compounds in the plant,including at least 65 other cannabinoids, including cannabidiol (CBD).Cannabis can be used by smoking, vaporizing, within food, or as an extract.
    buy marijuana online USA, UK, Canada, Australia and Germany.

    ReplyDelete
  32. buy weed in bulk USA, UK, Canada, Australia and Germany
    Best Marijuana Dispensary Online also known as 420 Marijuana Thrives among other names, is a psychoactive drug dispensary from the Cannabis plant used primarily for medical or recreational purposes. The main psychoactive component of cannabis is tetrahydrocannabinol (THC), which is one of the 483 known compounds in the plant,including at least 65 other cannabinoids, including cannabidiol (CBD).Cannabis can be used by smoking, vaporizing, within food, or as an extract.
    buy marijuana online USA, UK, Canada, Australia and Germany.

    ReplyDelete
  33. we do supply thc cartridges,wax oil, Psychedelics and top shelf marijuana of all varieties ,Best deals .We do  too ,we do shipping to different states and countries we do door steps delivery  and also meetups if necessary .Let me know if you will like to take a look at my menu.

    Expresscannashop.com

    hit me for more whatsapp me on +1(956)307-8503

    ReplyDelete
  34. We have seen many blog but this the great one, Thanks for provide great informatic and looking beautiful blog, really nice required information & the things i never imagined and i would like to request, wright more blog and blog post like that for us. Thanks you once agian

    birth certificate in delhi
    birth certificate in noida
    birth certificate in ghaziabad
    birth certificate in gurgaon
    birth certificate agent in delhi
    marriage registration in delhi
    marriage certificate delhi
    how to change name in 10th marksheet
    marriage registration in ghaziabad
    marriage registration in gurgaon

    ReplyDelete
  35. vThanks for the opportunuity, kindness, and goodwill, in letting us comment here.
    White House could determine whether marijuana remains illegal at the federal level.
    Also, most Americans live in states where marijuana is legal in some form and 11 now have fully legalized the drug for adults.
    In conservative Mississippi, voters will consider competing ballot proposals that would legalize medicinal marijuana,which is allowed in 33 states.
    “It’s laying out a domino effect ... that’s going to unlock the largest area of population behind the West Coast,” Kovacevich said.
    With that being said, thanks for being so kind. Please keep on posting relevant blog posts like these thank you.


    ReplyDelete
  36. Buy steroid stacks for best results. Steroids for beginners - advanced users. Best place to buy steroids online since 2004! featured products. Arete Steroids is a premium online steroid marketplace that allows you to buy steroids in the United Kingdom with confidence.

    Anabolic steroids produce a permanent increase in users' capacity for muscle development. In keeping with this, studies show that mice given testosterone acquire new myonuclei that persist long after the steroid use ends.

    With us you can buy testosterone online. Don't know which drug to choose? choose a full steroid course from the catalog.

    Buy IGF online
    Buy CJC 1295 2mg online
    Buy Androbolan 400 online
    Buy Subutex online

    Att köpa medicin över Internet kan göra livet mycket enklare. Läkemedel på Internet är ibland billigare. Dina piller levereras till din dörr.

    Tyvärr finns det många oärliga apotek online - och det kan vara svårt att berätta för de ärliga från de oärliga. Så du måste vara mycket försiktig när du köper läkemedel online.

    Du kan säkert köpa medicin online om du använder onlineapotek som rekommenderas av National Association of Boards of Pharmacy. Denna organisation verifierar Internet-apotek över hela det svenska territoriet.

    köpa Viagra i sverige
    köpa xanax i sverige
    köpa oxynorm 10mg i sverige
    köpa Genotropin pen Pfizer 12mg i sverige
    köpa Levitra 20mg i sverige




    ReplyDelete
  37. Buy steroid stacks for best results. Steroids for beginners - advanced users. Best place to buy steroids online since 2004! featured products. Arete Steroids is a premium online steroid marketplace that allows you to buy steroids in the United Kingdom with confidence.

    Anabolic steroids produce a permanent increase in users' capacity for muscle development. In keeping with this, studies show that mice given testosterone acquire new myonuclei that persist long after the steroid use ends.

    With us you can buy testosterone online. Don't know which drug to choose? choose a full steroid course from the catalog.

    Buy IGF online
    Buy CJC 1295 2mg online
    Buy Androbolan 400 online
    Buy Subutex online

    Att köpa medicin över Internet kan göra livet mycket enklare. Läkemedel på Internet är ibland billigare. Dina piller levereras till din dörr.

    Tyvärr finns det många oärliga apotek online - och det kan vara svårt att berätta för de ärliga från de oärliga. Så du måste vara mycket försiktig när du köper läkemedel online.

    Du kan säkert köpa medicin online om du använder onlineapotek som rekommenderas av National Association of Boards of Pharmacy. Denna organisation verifierar Internet-apotek över hela det svenska territoriet.

    köpa Viagra i sverige
    köpa xanax i sverige
    köpa oxynorm 10mg i sverige
    köpa Genotropin pen Pfizer 12mg i sverige
    köpa Levitra 20mg i sverige




    ReplyDelete

  38. Looking for a play partner or a parrot to adopt, We have well train parrots at our ranch.We also Train them on the interactive and basic activities they need to know or carry out, Our baby birds are friendly allowed to fully fledge, and are well-socialized with other birds and humans in the society.We send them along with food samples and menu.Play toys, And otheraccessories. Check on our website for more information.

    https://daily-parrots.company.com
    https://daily-parrots.company.com/african-grey-parrot.html
    https://daily-parrots.company.com/blue-and-gold-parrot.html
    https://daily-parrots.company.com/military-macaw-parrot.html
    https://daily-parrots.company.com/red-and-green-macaw-parrot.html
    https://daily-parrots.company.com/shipping.html
    https://daily-parrots.company.com/bird-cage.html

    ReplyDelete

  39. You’re so awesome! I do not believe I’ve read through a single thing like that before. So wonderful to discover another person with original thoughts on this subject. Seriously.thanks for starting this up. Thanks for sharing! Know about Garmin Express.

    ReplyDelete
  40. Garmin is known for its compatibility with most of the devices, as well as operating systems. The procedures of installing or going for Garmin.com/Express is different for all OS's and devices. The Garmin express app versions are quite advanced and offer excellent performance for all android, Windows, and Mac. We are available 24x7!

    ReplyDelete
  41. it's important to keep a strict eye on your stocked pet food. Since you will be with your pet almost all the time, you might be tempted to feed him extra just to keep him happy. Avoid doing so because your pet is already without physical activities and it will be wise to not run out of food before the lockdown is over.

    golden retriever puppies for sale in pa
    golden retriever for adoption near me

    ReplyDelete
  42. Are you looking for Skip Hire Services Near Me? Skip Hire Near Me offering Cheap Skip Hire Services in the UK at cheap rates. Now you can choose your ideal skip according to your budget and requirements. Compare Prices Now!

    ReplyDelete
  43. Thanks for providing a useful article containing valuable information. for alll your cannabis products click on the link bellow
    https://420herbalganja.com/

    ReplyDelete
  44. The fundamental initiative comes with the research and collective efforts
    seeking to give out what is oriented and necessary for every person to
    come up with a decisive measure for the procession of initial and planned
    programs for any one up coming to give a little bit of spicy and nice lingual.
    https://www.guspuppiesmansion.com/teacup-poodle-puppies

    ReplyDelete
  45. Thanks for the great information you shared above. Keep sharing such interesting and helpful articles with us

    Pomeranian puppies for sale near me
    Maltese puppies for sale near me
    Indian ring neck parrots for sale near me
    Maltese puppies for sale near me

    ReplyDelete
  46. Awesome post from these sites makes it easy and reliable for anyone to get what they are interested in getting.Thank you for
    trusting these and we look foward to more of these posts

     BUDGERIGAR PARROTS FOR SALE
     POMERANIAN PUPPY
     SHIH TZU PUPPIES
     Maltese puppies

    ReplyDelete
  47. All products come with manual and most of them are still in box but not all are brand new.
    These are not stolen and there’s a

    sales document issued for each.
    We also ship to an FFL for those who prefer it that way.
    Please feel free to visit our website https://www.legitarmsdealer.com/
    smith-wesson-mp-shield https://www.buycounterfeitbills.com/
    https://medicalpillsonline.com https://allbengalkittens.com/
    https://www.legitarmsdealer.com/ http://goldenretrievers.company.com/ https://www.parottdise.com
    https://capuchinmonkey.company.com/ capuchin-monkeys-for-adoption
    buy-african-grey-parrots
    golden-retriever-for-sale

    ReplyDelete
  48. All products come with manual and most of them are still in box but not all are brand new.
    These are not stolen and there’s a

    sales document issued for each.
    We also ship to an FFL for those who prefer it that way.
    Please feel free to visit our website https://www.legitarmsdealer.com/
    smith-wesson-mp-shield https://www.buycounterfeitbills.com/
    https://medicalpillsonline.com https://allbengalkittens.com/
    https://www.legitarmsdealer.com/ http://goldenretrievers.company.com/ https://www.parottdise.com
    https://capuchinmonkey.company.com/ capuchin-monkeys-for-adoption
    buy-african-grey-parrots
    golden-retriever-for-sale

    ReplyDelete
  49. Nice.This blog is very informative and interesting.Thanks for sharing such a good information.Please do visit to find more on Workday Training.

    ReplyDelete
  50. The Garmin GPS is significantly recommended to the process of the Garmin GPS registration and also its innumerable benefits. The completion of the registration will help get frequent updates about the Garmin application Using Garmin GPS device is not less than a blessing for frequent travelers. But to have best navigation experience in every travel, having Garmin GPS update is important.

    ReplyDelete
  51. Using Magellan gps update device is very rewarding. However, you need to always keep tabs on the maps and on the software version, Magellan GPS is one of these device that enable you to get where you want without having to think about finding the best route to take you to destination. Garmin nuvi's are maps that are very popular today. The Garmin Nuvi update which range from maps to modern features with voice activated navigation, has a GPS unit that will fit your needs.

    ReplyDelete
  52. You can even sign in with code and fubotv connect enter code to log in. Fubotv connect code will help you log in using a code. The code is active only for five minutes. You must enter the details within five minutes to fubo.tv/activate and view FuboTV on your streaming device. Follow the above-guide to resolve the errors and watch your favourite sports or entertainment shows on FuboTV.
    fubo.tv/Connect

    ReplyDelete
  53. All Sphynx Kittens For Sale come home between 10-13 weeks old and include spay/neuter, microchipping, health certificate, EIGHT YEAR HCM guarantee, ONE-year congenital guarantee, negative fecal, first two FVRCP vaccines, FeLV/FIV negative, registration papers to TICA upon request, one free month Trupanion health insurance, and a lifetime of breeder support.
    Sphynx cat for sale are among the most loving and friendly cats. They are gentle, easygoing, and good with kids, dogs, and other cats. The flip side of all that friendliness is that they need companionship. This breed does not like being left alone, and they have a desperate need for attention.
    Each kitten is raised like a pet and has free run. Most families have 1 to 2 cats so that each cat and kitten has the love and attention that a pet deserves. This breed requires it to thrive! Having a family of homes share in this beautiful breed has been fantastic for us all. Sphynx Kittens for sale
    Sphynx Kittens For Sale,?We are a TICA registered Sphynx cattery raising show and pet quality Sphynx, Dwelf, Elf, & Bambino kittens.

    Visit Our Website at http://sphynx.company.com

    Sphynx Kittens For Sale, Sphynx Cat For Sale

    ReplyDelete
  54. visit psychepharma.com for your buy dmt online, Buy EpiPen Online, buy lsd online, kush, coke, mdma,pills Buy Runtz Weed online, Alaskan Thunder for sale, buy Atomic Jack
    wickr: nelcotfelia
    +12698156151

    ReplyDelete
  55. looking to buy weed online? legit online dispensary ship all 50 states thanks you for this article buy weed online in addition, buy weed online legit

    ReplyDelete
  56. buy weed online and save money to buy even more legit online dispensary ship all 50 states thanks you for this article buy weed online in addition, buy weed online legit

    ReplyDelete
  57. As a 60-year-old I’ve lived a very adventurous and exciting life. I participated in the June 25th through 27th ceremonies at Ayahuasca Haven. (ayahuascahaven.com).I can honestly say is I’ve never encountered such a safe, loving, and compassionate collection of beautiful humans. Prior to attending this weekend, I had zero hope in humanity. I did not trust people. This has been the most transformative experience of my life. My heart was healed and now open to receive love. The entire staff and group of volunteers made this experience magical. This is My place. Ayahuasca is a beautiful and Sacred gift that needs to be protected.
    I love you all! Thank you for restoring my hope and healing my broken heart at ayahuascahaven.com

    Rusty “William” Pipes

    ReplyDelete
  58. CBD SkincareYou might have heard of the many benefits of CBD or cannabidiol. But do you know about the skin care products as well? CBD skin care products typically contain hemp seed oil which is considered a natural skin emollient and moisturizer.

    ReplyDelete
  59. If you have an email id, these days, all the FuboTV supportive devices like TV, Smart Phones have the option for signing through Email and Password. For that, all you have to do is open the FuboTV app and sign in using Email and password, and you are all set to go. You must have signed in to FuboTV in your browser, then only you’ll be redirected to FuboTv Connect code.
    fubo.tv/Connect

    ReplyDelete

  60. Very good post. It's a pretty good post. I just found your blog and wanted to say that I really enjoyed reading your posts.federal 556 420 rounds
    Anyway, I will subscribe to your feed and hope you will post again soon. Thank you very much for the valuable information on

    ReplyDelete
  61. Great suggestions in this post,winchester usa forged review I'll have to personally add this to my favorites and come back to it.
    I'm wondering if you have a few following this post.

    ReplyDelete
  62. Great suggestions in this post, I'll have to personally add this to my favorites and come back to it.american eagle bulk ammo
    I'm wondering if you have a few following this post.

    ReplyDelete
  63. Thoughts On Programming: Clojure Vs Scala >>>>> Download Now

    >>>>> Download Full

    Thoughts On Programming: Clojure Vs Scala >>>>> Download LINK

    >>>>> Download Now

    Thoughts On Programming: Clojure Vs Scala >>>>> Download Full

    >>>>> Download LINK 6e

    ReplyDelete
  64. wordpress design agency in united states Need professional WordPress Web Design Services? We're experts in developing attractive mobile-friendly WordPress websites for businesses. Contact us today!

    ReplyDelete
  65. Fake Louis Vuitton handbags, Louis Vuitton bags copies sale at PerfectionImitation, offering the highest quality, 1:1 fake, 7A, First Copy replica Louis Vuitton purses online.

    ReplyDelete