{"data":{"allEventMdx":{"edges":[{"node":{"body":"var _excluded = [\"components\"];\nfunction _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\nfunction _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }\nfunction _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }\n/* @jsxRuntime classic */\n/* @jsx mdx */\n\nvar _frontmatter = {\n  \"path\": \"/events/ashframeworkbook\",\n  \"date\": \"2025-03-18T00:00:00.000Z\",\n  \"time\": \"6:00 - 8:00 PM\",\n  \"title\": \"SPA-like UX with MVC-like DX, and ​Writing the book on Ash\",\n  \"location\": \"online-location\",\n  \"organisers\": [\"josh-price\", \"mike-buhot\"],\n  \"sponsors\": [\"alembic\"],\n  \"talks\": [{\n    \"speaker\": \"mike-buhot\",\n    \"title\": \"SPA-like UX with MVC-like DX: InertiaJS with React and Phoenix\",\n    \"description\": \"​Mike will share what he's recently learnt trying out InertiaJS with a React Frontend and a Phoenix Backend. TL,DR: The user experience feels like a SPA while the developer experience feels like MVC.\"\n  }, {\n    \"speaker\": \"rebecca-le\",\n    \"title\": \"​Writing the book on Ash\",\n    \"description\": \"​The Ash Framework book beta landed last month! Written by Rebecca Le and Zach Daniel, this essential guide for building declarative Elixir web apps using the Ash Framework should be part of every Elixir developers' game-changing toolkit. Join Rebecca as she shares the journey of putting their expertise to paper.\"\n  }],\n  \"description\": null\n};\nvar layoutProps = {\n  _frontmatter: _frontmatter\n};\nvar MDXLayout = \"wrapper\";\nreturn function MDXContent(_ref) {\n  var components = _ref.components,\n    props = _objectWithoutProperties(_ref, _excluded);\n  return mdx(MDXLayout, _extends({}, layoutProps, props, {\n    components: components,\n    mdxType: \"MDXLayout\"\n  }), mdx(\"p\", null, \"Hey Elixir community! Welcome to the first Elixir Sydney meetup for 2025 - this is online, so come and join us from wherever you are.\"), mdx(\"p\", null, \"Got an idea for an Elixir talk? We\\u2019d love to hear it! Whether you\\u2019re an experienced developer with deep insights or just starting out and excited to share what you\\u2019ve learned, our meetups are a great place to connect, learn, and grow.\"), mdx(\"p\", null, \"Not ready to give a talk? No worries! Come along to meet fellow Elixir enthusiasts, ask questions, and get guidance from more experienced developers. Everyone is welcome \\u2014 no matter your skill level!\"), mdx(\"p\", null, \"If you\\u2019d like to submit a talk idea, just drop us a message\\u2014we\\u2019re happy to help you shape it into a great presentation!\"), mdx(\"p\", null, \"Josh and Mike\"));\n}\n;\nMDXContent.isMDXComponent = true;","title":"SPA-like UX with MVC-like DX, and ​Writing the book on Ash","path":"/events/ashframeworkbook","date":"March 2025","description":null,"mainImage":null}},{"node":{"body":"var _excluded = [\"components\"];\nfunction _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\nfunction _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }\nfunction _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }\n/* @jsxRuntime classic */\n/* @jsx mdx */\n\nvar _frontmatter = {\n  \"path\": \"/events/bulmacomponents\",\n  \"date\": \"2024-07-24T00:00:00.000Z\",\n  \"time\": \"6:00 - 8:00 PM\",\n  \"title\": \"BulmaComponents and The new Set-Theoretic Type System for Elixir\",\n  \"location\": \"online-location\",\n  \"organisers\": [\"josh-price\", \"mike-buhot\"],\n  \"sponsors\": [\"alembic\"],\n  \"talks\": [{\n    \"speaker\": \"dave-parry\",\n    \"title\": \"BulmaComponents: a new CoreComponents library for Phoenix\",\n    \"description\": \"Although Tailwind CSS is everywhere in the Phoenix ecosystem, I thought it was time to add an alternative that uses `bulma`(https://bulma.io/). We'll look through how it's structured, and what it looks like in both HTML markup and using `PhoenixStorybook`.\",\n    \"video\": \"https://youtu.be/p55crhsJp08?si=luOjclylyBrN7NHn\"\n  }, {\n    \"speaker\": \"robert-ellen\",\n    \"title\": \"The new Set-Theoretic Type System for Elixir\",\n    \"description\": \"Rob gives us some hands-on impressions of the new Type Checking features that recently landed in Elixir 1.17\",\n    \"video\": \"https://youtu.be/li1MRJPmhOI?si=gYGQCk_sqFg4Hiqs\"\n  }],\n  \"description\": null\n};\nvar layoutProps = {\n  _frontmatter: _frontmatter\n};\nvar MDXLayout = \"wrapper\";\nreturn function MDXContent(_ref) {\n  var components = _ref.components,\n    props = _objectWithoutProperties(_ref, _excluded);\n  return mdx(MDXLayout, _extends({}, layoutProps, props, {\n    components: components,\n    mdxType: \"MDXLayout\"\n  }));\n}\n;\nMDXContent.isMDXComponent = true;","title":"BulmaComponents and The new Set-Theoretic Type System for Elixir","path":"/events/bulmacomponents","date":"July 2024","description":null,"mainImage":null}},{"node":{"body":"var _excluded = [\"components\"];\nfunction _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\nfunction _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }\nfunction _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }\n/* @jsxRuntime classic */\n/* @jsx mdx */\n\nvar _frontmatter = {\n  \"path\": \"/events/practical-ai-in-elixir\",\n  \"date\": \"2024-06-24T00:00:00.000Z\",\n  \"time\": \"6:00 - 8:00 PM\",\n  \"title\": \"Practical AI In Elixir\",\n  \"location\": \"microsoft-location\",\n  \"organisers\": [\"josh-price\", \"mike-buhot\"],\n  \"sponsors\": [\"alembic\"],\n  \"talks\": [{\n    \"speaker\": \"chris-grainger\",\n    \"title\": \"A Practical Guide to Machine Learning in Elixir\",\n    \"description\": \"At Amplified, we've been putting ML in production with Elixir since the very early days of Nx in 2022. This talk is a practical guide to doing the same, informed by our experiences and the lessons we've learned. Because every project, company, and machine learning task is different, I will combine a general 'roadmap' approach with insights shaped by our particular set of problems and perspectives. We managed to go all in on Elixir, ridding our stack of Python entirely, and I believe (in most cases) you can too.\",\n    \"video\": \"https://youtu.be/Es08MRtSkoE?si=uLFYacmUu37H1D8j\"\n  }, {\n    \"speaker\": \"josh-price\",\n    \"title\": \"Working with OpenAI APIs in Elixir\",\n    \"description\": \"Discover the power of integrating OpenAI's cutting-edge APIs into your Elixir applications. This talk will guide you through the essentials of setting up, authenticating, and making requests to OpenAI's API using Elixir. We'll cover practical examples, best practices, and common pitfalls, ensuring you leave equipped to harness the full potential of AI in your projects. Whether you're building chatbots, generating content, or exploring new AI-driven functionalities, this session will provide the knowledge and tools you need to succeed.\",\n    \"video\": \"https://youtu.be/9d1y1x8Ezpw?si=5Et0ueCuNJlWoKx9\"\n  }],\n  \"description\": null\n};\nvar layoutProps = {\n  _frontmatter: _frontmatter\n};\nvar MDXLayout = \"wrapper\";\nreturn function MDXContent(_ref) {\n  var components = _ref.components,\n    props = _objectWithoutProperties(_ref, _excluded);\n  return mdx(MDXLayout, _extends({}, layoutProps, props, {\n    components: components,\n    mdxType: \"MDXLayout\"\n  }), mdx(\"p\", null, \"Elixir Sydney is back for the June 2024 meetup with an AI themed event! We're in-person and online, so come and join us from wherever you are.\"), mdx(\"p\", null, \"Josh and Mike\"));\n}\n;\nMDXContent.isMDXComponent = true;","title":"Practical AI In Elixir","path":"/events/practical-ai-in-elixir","date":"June 2024","description":null,"mainImage":null}},{"node":{"body":"var _excluded = [\"components\"];\nfunction _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\nfunction _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }\nfunction _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }\n/* @jsxRuntime classic */\n/* @jsx mdx */\n\nvar _frontmatter = {\n  \"path\": \"/events/efficient-image-processing-runtime-type-validation-elixieconf-eu-highlights\",\n  \"date\": \"2024-05-22T00:00:00.000Z\",\n  \"time\": \"6:00 - 8:00 PM\",\n  \"title\": \"Elixir Sydney May\",\n  \"location\": \"microsoft-location\",\n  \"organisers\": [\"josh-price\", \"mike-buhot\"],\n  \"sponsors\": [\"alembic\"],\n  \"talks\": [{\n    \"speaker\": \"kip-cole\",\n    \"title\": \"Fast and efficient image processing in Elixir\",\n    \"description\": \"Images influence every aspect of an application design and UX. They comprise a significant amount of the payload for many apps. This talk looks at how the combination of libvips, vix and image can be used to: Scale, resize, transform and compose images fast and efficiently, Streaming image pipelines from the front end through to external storage services, Deliver the right image size dynamically to Plug-based apps and Vectorise raster images to SVG for fun - and for efficient image placeholders.\"\n  }, {\n    \"speaker\": \"nicholas-hammond\",\n    \"title\": \"Tools for runtime validation of types\",\n    \"description\": \"Nicholas talks about hist experiences trying out a few tools that do runtime validation of types\"\n  }, {\n    \"speaker\": \"josh-price\",\n    \"title\": \"Highlights from Elixir Conf EU and Gig City Elixir\",\n    \"description\": \"Josh shares the news, announcements and best talks to watch online from Elixir Conf EU and Gig City Elixir\"\n  }],\n  \"description\": null\n};\nvar layoutProps = {\n  _frontmatter: _frontmatter\n};\nvar MDXLayout = \"wrapper\";\nreturn function MDXContent(_ref) {\n  var components = _ref.components,\n    props = _objectWithoutProperties(_ref, _excluded);\n  return mdx(MDXLayout, _extends({}, layoutProps, props, {\n    components: components,\n    mdxType: \"MDXLayout\"\n  }), mdx(\"p\", null, \"Elixir Sydney is back for the May 2024 meetup! We're in-person and online, so come and join us from wherever you are.\"), mdx(\"p\", null, \"Josh and Mike\"));\n}\n;\nMDXContent.isMDXComponent = true;","title":"Elixir Sydney May","path":"/events/efficient-image-processing-runtime-type-validation-elixieconf-eu-highlights","date":"May 2024","description":null,"mainImage":null}},{"node":{"body":"var _excluded = [\"components\"];\nfunction _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\nfunction _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }\nfunction _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }\n/* @jsxRuntime classic */\n/* @jsx mdx */\n\nvar _frontmatter = {\n  \"path\": \"/events/whats-in-a-name-and-easy-peg-parsers\",\n  \"date\": \"2024-03-20T00:00:00.000Z\",\n  \"time\": \"6:00 - 8:00 PM\",\n  \"title\": \"Elixir Sydney March\",\n  \"location\": \"microsoft-location\",\n  \"organisers\": [\"josh-price\", \"mike-buhot\"],\n  \"sponsors\": [\"alembic\"],\n  \"talks\": [{\n    \"speaker\": \"kip-cole\",\n    \"title\": \"What's in a name? Addressing people by the right name at the right time around the world\",\n    \"description\": \"Audience engagement is a critical factor in application success. And engaging with people requires addressing them the right way. How you are addressed will depend on whether I'm representing the tax department, a close friend, family, a social media site or a civil or military honours organisation. Thats hard enough in English. But names are even more interesting and diverse in other cultures.  This talk looks at recent work by the CLDR Person Names working group to formalise name formatting and introduces `ex_cldr_person_names` as the latest addition to the ex_cldr family of localisation libraries.\"\n  }, {\n    \"speaker\": \"abhishek-tripathi\",\n    \"title\": \"Easy Parser Combinators with PEG\",\n    \"description\": \"Ever wanted to know how to write parser combinators using PEG grammars? In this talk Abhishek will show how to combine NimbleParsec and Pegasus, complete with a livebook demo.\"\n  }],\n  \"description\": null\n};\nvar layoutProps = {\n  _frontmatter: _frontmatter\n};\nvar MDXLayout = \"wrapper\";\nreturn function MDXContent(_ref) {\n  var components = _ref.components,\n    props = _objectWithoutProperties(_ref, _excluded);\n  return mdx(MDXLayout, _extends({}, layoutProps, props, {\n    components: components,\n    mdxType: \"MDXLayout\"\n  }), mdx(\"p\", null, \"Elixir Sydney is back for the March 2024 meetup! We're in-person and online, so come and join us from wherever you are.\"), mdx(\"p\", null, \"Josh and Mike\"));\n}\n;\nMDXContent.isMDXComponent = true;","title":"Elixir Sydney March","path":"/events/whats-in-a-name-and-easy-peg-parsers","date":"March 2024","description":null,"mainImage":null}},{"node":{"body":"var _excluded = [\"components\"];\nfunction _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\nfunction _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }\nfunction _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }\n/* @jsxRuntime classic */\n/* @jsx mdx */\n\nvar _frontmatter = {\n  \"path\": \"/events/erlang-tracing-and-ash-spark-dsls\",\n  \"date\": \"2024-02-21T00:00:00.000Z\",\n  \"time\": \"6:00 - 8:00 PM\",\n  \"title\": \"Elixir Sydney February\",\n  \"location\": \"microsoft-location\",\n  \"organisers\": [\"josh-price\", \"mike-buhot\"],\n  \"sponsors\": [\"alembic\"],\n  \"talks\": [{\n    \"speaker\": \"lars-wikman\",\n    \"title\": \"Do you use Erlang tracing? You should!\",\n    \"description\": \"Welcome to my little tracing talk. An informal romp through Erlang's fundamental tracing facilities. Then onwards to the common libraries that you should probably use. Beyond that we go to an experimental Elixir library I'm building out to make it so simple that I will actually use it. And maybe some UI...\"\n  }, {\n    \"speaker\": \"josh-price\",\n    \"title\": \"Give Your Domain Experts Superpowers with Spark DSLs\",\n    \"description\": \"Want to build a DSL but don't want to write and maintain macros? In this session we will examine how useful Domain Specific Languages can be, and how Spark can help you build powerful DSLs in Elixir fast. Spark DSLs are self-documenting, extensible and come with auto-complete and language tooling out of the box. Best of all you don't need to write macros to do it! You will learn how DSLs can give your domain experts superpowers, and how you can use them in your applications. You'll be able to know when DSLs are useful and when they are not. Most importantly you'll be able to build powerful DSLs quickly without having to use macros.\"\n  }],\n  \"description\": null\n};\nvar layoutProps = {\n  _frontmatter: _frontmatter\n};\nvar MDXLayout = \"wrapper\";\nreturn function MDXContent(_ref) {\n  var components = _ref.components,\n    props = _objectWithoutProperties(_ref, _excluded);\n  return mdx(MDXLayout, _extends({}, layoutProps, props, {\n    components: components,\n    mdxType: \"MDXLayout\"\n  }), mdx(\"p\", null, \"Welcome to the first Elixir Sydney meetup for 2024! We're in-person and online, so come and join us from wherever you are.\"), mdx(\"p\", null, \"Josh and Mike\"));\n}\n;\nMDXContent.isMDXComponent = true;","title":"Elixir Sydney February","path":"/events/erlang-tracing-and-ash-spark-dsls","date":"February 2024","description":null,"mainImage":null}},{"node":{"body":"var _excluded = [\"components\"];\nfunction _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\nfunction _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }\nfunction _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }\n/* @jsxRuntime classic */\n/* @jsx mdx */\n\nvar _frontmatter = {\n  \"path\": \"/events/live-with-jose-2023\",\n  \"date\": \"2023-12-06T00:00:00.000Z\",\n  \"time\": \"6:00 - 8:00 PM\",\n  \"title\": \"Special Event - José Valim live and in person!\",\n  \"location\": \"blackbird-ventures-location\",\n  \"organisers\": [\"josh-price\", \"mike-buhot\"],\n  \"sponsors\": [\"alembic\"],\n  \"talks\": [{\n    \"speaker\": \"jose-valim\",\n    \"title\": \"Q&A with José Valim\",\n    \"description\": \"José Valim will host an informal Q&A session, and might even show us some Livebook if you ask nicely.\"\n  }, {\n    \"speaker\": \"nick-gunn\",\n    \"title\": \"Hot-Code Upgrades with Castle\",\n    \"description\": \"Hot-code upgrades have been one of the more compelling but underused features of the BEAM. In this talk, Nick will take us on a deep dive into hot-code upgrades, how they work and why the Castle library helps.\"\n  }],\n  \"description\": null\n};\nvar layoutProps = {\n  _frontmatter: _frontmatter\n};\nvar MDXLayout = \"wrapper\";\nreturn function MDXContent(_ref) {\n  var components = _ref.components,\n    props = _objectWithoutProperties(_ref, _excluded);\n  return mdx(MDXLayout, _extends({}, layoutProps, props, {\n    components: components,\n    mdxType: \"MDXLayout\"\n  }), mdx(\"p\", null, \"We're delighted to announce that Jos\\xE9 Valim will be joining us at the December meetup in person.\"), mdx(\"p\", null, \"Places are limited, so please respond ASAP if you're up for mingling with some fellow Alchemists and Jos\\xE9 on Wednesday 6th December.\"), mdx(\"p\", null, \"See you there,\"), mdx(\"p\", null, \"Josh and Mike\"));\n}\n;\nMDXContent.isMDXComponent = true;","title":"Special Event - José Valim live and in person!","path":"/events/live-with-jose-2023","date":"December 2023","description":null,"mainImage":null}},{"node":{"body":"var _excluded = [\"components\"];\nfunction _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\nfunction _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }\nfunction _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }\n/* @jsxRuntime classic */\n/* @jsx mdx */\n\nvar _frontmatter = {\n  \"path\": \"/events/elixir-back-2020\",\n  \"date\": \"2020-02-05T00:00:00.000Z\",\n  \"time\": \"6:00 - 8:30 PM\",\n  \"title\": \"Elixir Sydney is back for 2020\",\n  \"location\": \"expert360-location\",\n  \"organisers\": [\"josh-price\", \"james-sadler\", \"paul-fioravanti\"],\n  \"sponsors\": [\"alembic\", \"expert360\"],\n  \"talks\": [{\n    \"speaker\": \"dan-draper\",\n    \"title\": \"Order Revealing Encryption for Cloud Data\",\n    \"description\": \"With significant data breaches becoming the daily norm, our approaches to storing data in the cloud, especially with 3rd party providers need to radically improve.\"\n  }, {\n    \"speaker\": \"lenfree-yeung\",\n    \"title\": \"My Journey to Elixir and Rate Limiting library\",\n    \"description\": \"Lenfree will talk about how he got started with Elixir, along with the things he likes and dislikes. Then he'll show off his solution and talk about his learnings for a rate limiting library, which he developed.\"\n  }],\n  \"description\": null\n};\nvar layoutProps = {\n  _frontmatter: _frontmatter\n};\nvar MDXLayout = \"wrapper\";\nreturn function MDXContent(_ref) {\n  var components = _ref.components,\n    props = _objectWithoutProperties(_ref, _excluded);\n  return mdx(MDXLayout, _extends({}, layoutProps, props, {\n    components: components,\n    mdxType: \"MDXLayout\"\n  }), mdx(\"p\", null, \"Elixir Sydney is back for 2020, and we've got some great talks lined up for you right out of the gate! So, join us for some functional-for-your-brain presentations and functional-for-your-appetite food and drinks and help us kick off the year!\"), mdx(\"p\", null, \"Beginners are more than welcome, and this a great chance to get started and get help from more experienced Elixir developers.\"), mdx(\"p\", null, \"Thanks very much to Expert360 for hosting us and providing drinks, and thanks to Alembic for providing the food.\"), mdx(\"p\", null, \"See you there,\"), mdx(\"p\", null, \"Josh, James, and Paul\"));\n}\n;\nMDXContent.isMDXComponent = true;","title":"Elixir Sydney is back for 2020","path":"/events/elixir-back-2020","date":"February 2020","description":null,"mainImage":null}},{"node":{"body":"var _excluded = [\"components\"];\nfunction _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\nfunction _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }\nfunction _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }\n/* @jsxRuntime classic */\n/* @jsx mdx */\n\nvar _frontmatter = {\n  \"path\": \"/events/last-elixir-sydney-2019\",\n  \"date\": \"2019-12-04T00:00:00.000Z\",\n  \"time\": \"6:00 - 8:00 PM\",\n  \"title\": \"Last Elixir Sydney of 2019\",\n  \"location\": \"expert360-location\",\n  \"organisers\": [\"josh-price\", \"james-sadler\", \"paul-fioravanti\"],\n  \"sponsors\": [\"alembic\", \"expert360\"],\n  \"talks\": [{\n    \"speaker\": \"placeholder\",\n    \"title\": \"Elixir Downunder\",\n    \"description\": \"In a format we've blatantly stolen borrowed from the end of year Cocoaheads trivia festival, we'll be throwing random questions at you which will stretch your noodles and maybe even teach you some interesting facts about Elixir or Erlang. Or maybe just programming in general.\",\n    \"photos\": \"https://alembic.com.au/static/dc946a1017e0665fccf2bd98abd98a67/c9121/elixir-sydney-july.jpg\",\n    \"slides\": \"https://speakerdeck.com/joshprice/elixir-performance-tuning\",\n    \"video\": \"https://www.youtube.com/watch?v=xTUK3uhFnlU\"\n  }],\n  \"description\": \"Currently looking for talks, let us know if you'd like to present a topic. Beginners are more than welcome, and this a great chance to get started and get help from more experienced Elixir developers.\",\n  \"mainImage\": \"./img8.jpeg\",\n  \"images\": [\"img8.jpeg\", \"img7.jpeg\"],\n  \"startDate\": \"2019-12-04T18:00+11:00\",\n  \"endDate\": \"2019-12-04T20:00+11:00\"\n};\nvar layoutProps = {\n  _frontmatter: _frontmatter\n};\nvar MDXLayout = \"wrapper\";\nreturn function MDXContent(_ref) {\n  var components = _ref.components,\n    props = _objectWithoutProperties(_ref, _excluded);\n  return mdx(MDXLayout, _extends({}, layoutProps, props, {\n    components: components,\n    mdxType: \"MDXLayout\"\n  }), mdx(\"p\", null, \"Currently looking for talks, let us know if you'd like to present a topic.\"), mdx(\"p\", null, \"Beginners are more than welcome, and this a great chance to get started and get help from more experienced Elixir developers.\"), mdx(\"p\", null, \"Thanks to Expert360 for hosting us and providing drinks, thanks Alembic for providing the food.\"), mdx(\"p\", null, \"See you there,\"), mdx(\"p\", null, \"Josh, James, and Paul\"));\n}\n;\nMDXContent.isMDXComponent = true;","title":"Last Elixir Sydney of 2019","path":"/events/last-elixir-sydney-2019","date":"December 2019","description":"Currently looking for talks, let us know if you'd like to present a topic. Beginners are more than welcome, and this a great chance to get started and get help from more experienced Elixir developers.","mainImage":{"publicURL":"/static/a59f34754df0b92627c7abbd6fb89446/img8.jpeg","childImageSharp":{"fluid":{"src":"/static/a59f34754df0b92627c7abbd6fb89446/14b42/img8.jpg"}}}}},{"node":{"body":"var _excluded = [\"components\"];\nfunction _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\nfunction _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }\nfunction _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }\n/* @jsxRuntime classic */\n/* @jsx mdx */\n\nvar _frontmatter = {\n  \"path\": \"/events/elixir-sydney-4th-birthday\",\n  \"date\": \"2019-08-07T00:00:00.000Z\",\n  \"time\": \"6:00 - 8:30 PM\",\n  \"title\": \"Elixir Sydney 4th Birthday\",\n  \"location\": \"expert360-location\",\n  \"organisers\": [\"josh-price\", \"james-sadler\", \"paul-fioravanti\"],\n  \"sponsors\": [\"alembic\", \"expert360\"],\n  \"talks\": [{\n    \"speaker\": \"jeffrey-chan\",\n    \"title\": \"Improving Performance with Elixir Tasks\",\n    \"description\": \"Jeff will cover how you might use Elixir Tasks to improve your parallelism without building Gen Servers.\"\n  }, {\n    \"speaker\": \"robin-hilliard\",\n    \"title\": \"Generating Elixir Code from XML for Fun and Profit\",\n    \"description\": \"Robin is going to talk about processing XML in Elixir.\"\n  }, {\n    \"speaker\": \"ruth-wang\",\n    \"title\": \"Exercism - Isogram\",\n    \"description\": \"Ruth will be covering our second Exercism exercise \\\"Isogram\\\" and showing us how she implemented her solution.\"\n  }],\n  \"description\": \"Happy 4th Birthday Elixir Sydney!\",\n  \"mainImage\": \"./img9.jpeg\",\n  \"images\": [\"img9.jpeg\", \"img5.jpeg\", \"img6.jpeg\", \"img7.jpeg\", \"img8.jpeg\"],\n  \"startDate\": \"2019-08-07T18:00+11:00\",\n  \"endDate\": \"2019-08-07T20:30+11:00\"\n};\nvar layoutProps = {\n  _frontmatter: _frontmatter\n};\nvar MDXLayout = \"wrapper\";\nreturn function MDXContent(_ref) {\n  var components = _ref.components,\n    props = _objectWithoutProperties(_ref, _excluded);\n  return mdx(MDXLayout, _extends({}, layoutProps, props, {\n    components: components,\n    mdxType: \"MDXLayout\"\n  }), mdx(\"p\", null, \"Happy 4th Birthday Elixir Sydney!\"), mdx(\"p\", null, \"We've got 2 great talks and an Exercism lightning talk.\"), mdx(\"p\", null, \"Improving Performance with Elixir Tasks - Jeff Chan\\nGenerating Elixir Code from XML for Fun and Profit - Robin Hilliard\\nExercism: Isogram - Ruth Wang\\nRuth will be covering our second Exercism exercise \\\"Isogram\\\" and showing us how she implemented her solution.\"), mdx(\"p\", null, \"Jeff will cover how you might use Elixir Tasks to improve your parallelism without building Gen Servers.\"), mdx(\"p\", null, \"Robin is going to talk about processing XML in Elixir:\"), mdx(\"p\", null, \"How you can use Erlang\\u2019s xmerl library to work with XML from Elixir\\nHow to write Elixir source from Elixir, including dealing with escaping stuff using sigils\\nHow to use the Code module to test code that you generate during your tests\\nSome examples of recursion and reducing that I didn\\u2019t expect to turn out half as elegant as they did\\nBeginners are more than welcome, and this a great chance to get started and get help from more experienced Elixir developers.\"), mdx(\"p\", null, \"Thanks to Expert360 for hosting us and providing drinks, thanks Alembic for providing the food.\"), mdx(\"p\", null, \"See you there,\", mdx(\"br\", {\n    parentName: \"p\"\n  }), \"\\n\", \"Josh, James, and Paul\"));\n}\n;\nMDXContent.isMDXComponent = true;","title":"Elixir Sydney 4th Birthday","path":"/events/elixir-sydney-4th-birthday","date":"August 2019","description":"Happy 4th Birthday Elixir Sydney!","mainImage":{"publicURL":"/static/8b9fe3e537cd56bb373c9e50164f1046/img9.jpeg","childImageSharp":{"fluid":{"src":"/static/8b9fe3e537cd56bb373c9e50164f1046/14b42/img9.jpg"}}}}},{"node":{"body":"var _excluded = [\"components\"];\nfunction _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\nfunction _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }\nfunction _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }\n/* @jsxRuntime classic */\n/* @jsx mdx */\n\nvar _frontmatter = {\n  \"path\": \"/events/elixir-downunder\",\n  \"title\": \"Elixir Downunder\",\n  \"date\": \"2019-03-06T00:00:00.000Z\",\n  \"time\": \"6:00 - 8:30 PM\",\n  \"location\": \"expert360-location\",\n  \"organisers\": [\"josh-price\", \"andrew-harvey\", \"josh-price\"],\n  \"sponsors\": [\"alembic\", \"expert360\"],\n  \"talks\": [{\n    \"speaker\": \"sophie-troy-alison-hughes\",\n    \"title\": \"Elixir Downunder\",\n    \"description\": \"Honoured to have Sophie and Alison give us a special preview of their talk for ElixirConfEU. They'll be talking about how Elixir is driving innovation in Australia.\"\n  }, {\n    \"speaker\": \"qing-wu\",\n    \"title\": \"Upgrading to Ecto 3\",\n    \"description\": \"Qing will give us a quick recap of Ecto and take us through the new features and upgrade path for Ecto 3.\"\n  }, {\n    \"speaker\": \"randolph-park\",\n    \"title\": \"Comparing Elixir and Rust\"\n  }],\n  \"description\": \"Honoured to have Sophie and Alison give us a special preview of their talk for ElixirConfEU. They'll be talking about how Elixir is driving innovation in Australia.\",\n  \"mainImage\": \"./elixir-sydney.jpg\",\n  \"images\": [\"elixir-sydney.jpg\"],\n  \"startDate\": \"2018-12-06T18:00+11:00\",\n  \"endDate\": \"2018-12-06T20:30+11:00\"\n};\nvar layoutProps = {\n  _frontmatter: _frontmatter\n};\nvar MDXLayout = \"wrapper\";\nreturn function MDXContent(_ref) {\n  var components = _ref.components,\n    props = _objectWithoutProperties(_ref, _excluded);\n  return mdx(MDXLayout, _extends({}, layoutProps, props, {\n    components: components,\n    mdxType: \"MDXLayout\"\n  }), mdx(\"p\", null, \"Honoured to have Sophie and Alison give us a special preview of their talk for ElixirConfEU. They'll be talking about how Elixir is driving innovation in Australia.\"), mdx(\"p\", null, \"Qing will give us a quick recap of Ecto and take us through the new features and upgrade path for Ecto 3.\"), mdx(\"p\", null, \"Beginners are more than welcome, and this a great chance to get started and get help from more experienced Elixir developers.\"), mdx(\"p\", null, \"Thanks to Expert360 for hosting us and providing drinks, thanks Alembic for providing the food.\"), mdx(\"p\", null, \"See you there,\"), mdx(\"p\", null, \"Josh and James\"));\n}\n;\nMDXContent.isMDXComponent = true;","title":"Elixir Downunder","path":"/events/elixir-downunder","date":"March 2019","description":"Honoured to have Sophie and Alison give us a special preview of their talk for ElixirConfEU. They'll be talking about how Elixir is driving innovation in Australia.","mainImage":{"publicURL":"/static/c97554d96d48b3de489ca41d98b96746/elixir-sydney.jpg","childImageSharp":{"fluid":{"src":"/static/c97554d96d48b3de489ca41d98b96746/57dc6/elixir-sydney.jpg"}}}}},{"node":{"body":"var _excluded = [\"components\"];\nfunction _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\nfunction _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }\nfunction _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }\n/* @jsxRuntime classic */\n/* @jsx mdx */\n\nvar _frontmatter = {\n  \"path\": \"/events/elixir-trivia-night\",\n  \"title\": \"Elixir Trivia Night\",\n  \"date\": \"2018-12-06T00:00:00.000Z\",\n  \"time\": \"6:00 - 8:30 PM\",\n  \"location\": \"pivotal-labs-location\",\n  \"organisers\": [\"josh-price\", \"andrew-harvey\", \"josh-price\"],\n  \"sponsors\": [\"alembic\", \"expert360\", \"alembic\"],\n  \"talks\": [{\n    \"speaker\": \"josh-price\",\n    \"title\": \"Elixir Downunder\",\n    \"description\": null,\n    \"slides\": \"https://speakerdeck.com/joshprice/elixir-performance-tuning\",\n    \"photos\": \"https://alembic.com.au/static/dc946a1017e0665fccf2bd98abd98a67/c9121/elixir-sydney-july.jpg\",\n    \"video\": \"https://www.youtube.com/watch?v=xTUK3uhFnlU\"\n  }, {\n    \"speaker\": \"andrew-harvey\",\n    \"title\": \"Upgrading to Ecto 3\",\n    \"description\": null,\n    \"slides\": \"https://speakerdeck.com/joshprice/elixir-performance-tuning\",\n    \"photos\": \"https://alembic.com.au/static/dc946a1017e0665fccf2bd98abd98a67/c9121/elixir-sydney-july.jpg\",\n    \"video\": \"https://www.youtube.com/watch?v=xTUK3uhFnlU\"\n  }],\n  \"description\": \"In a format we've blatantly stolen borrowed from the end of year Cocoaheads trivia festival, we'll be throwing random questions at you which will stretch your noodles and maybe even teach you some interesting facts about Elixir or Erlang.\",\n  \"mainImage\": \"./img1.jpeg\",\n  \"images\": [\"./img1.jpeg\"],\n  \"startDate\": \"2018-12-06T18:00+11:00\",\n  \"endDate\": \"2018-12-06T20:30+11:00\"\n};\nvar layoutProps = {\n  _frontmatter: _frontmatter\n};\nvar MDXLayout = \"wrapper\";\nreturn function MDXContent(_ref) {\n  var components = _ref.components,\n    props = _objectWithoutProperties(_ref, _excluded);\n  return mdx(MDXLayout, _extends({}, layoutProps, props, {\n    components: components,\n    mdxType: \"MDXLayout\"\n  }), mdx(\"p\", null, \"In a format we've blatantly stolen borrowed from the end of year Cocoaheads trivia festival, we'll be throwing random questions at you which will stretch your noodles and maybe even teach you some interesting facts about Elixir or Erlang. Or maybe just programming in general.\"), mdx(\"p\", null, \"Elixir and Erlang developers of all levels are welcome. Whether you are a complete beginner or just little curious about the powers of OTP and the BEAM. The Elixir Sydney Meetup is a great chance to get started and mingle with experienced Elixir developers and others just starting the journey.\"), mdx(\"p\", null, \"See you there,\"), mdx(\"p\", null, \"Josh, James and Andrew\"));\n}\n;\nMDXContent.isMDXComponent = true;","title":"Elixir Trivia Night","path":"/events/elixir-trivia-night","date":"December 2018","description":"In a format we've blatantly stolen borrowed from the end of year Cocoaheads trivia festival, we'll be throwing random questions at you which will stretch your noodles and maybe even teach you some interesting facts about Elixir or Erlang.","mainImage":{"publicURL":"/static/288612ee17c00d735ddf1abcd188b571/img1.jpeg","childImageSharp":{"fluid":{"src":"/static/288612ee17c00d735ddf1abcd188b571/14b42/img1.jpg"}}}}},{"node":{"body":"var _excluded = [\"components\"];\nfunction _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\nfunction _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }\nfunction _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }\n/* @jsxRuntime classic */\n/* @jsx mdx */\n\nvar _frontmatter = {\n  \"path\": \"/events/bitcoin-and-languages-boundaries\",\n  \"date\": \"2018-02-07T00:00:00.000Z\",\n  \"time\": \"6:00 - 8:30 PM\",\n  \"title\": \"Bitcoin and Languages Boundaries\",\n  \"location\": \"pivotal-labs-location\",\n  \"organisers\": [\"josh-price\", \"andrew-harvey\"],\n  \"sponsors\": [\"alembic\", \"pivotal-labs\"],\n  \"talks\": [{\n    \"speaker\": \"paul-fioravanti\",\n    \"title\": \"Get Paid in Bitcoin\",\n    \"description\": \"Paul is going to present ways of working with libraries outside of Elixir and Erlang (like Python and C++) with a healthy side serving of cryptocurrency. Live coding\"\n  }],\n  \"description\": \"First Elixir meetup for 2018! Hope you all had a wonderful holiday and are excited about the future of our favourite programming ecosystem.\",\n  \"mainImage\": \"./bitcoin.jpg\",\n  \"images\": [\"./bitcoin.jpg\"],\n  \"startDate\": \"2019-03-13T18:00+11:00\",\n  \"endDate\": \"2019-03-13T20:30+11:00\"\n};\nvar layoutProps = {\n  _frontmatter: _frontmatter\n};\nvar MDXLayout = \"wrapper\";\nreturn function MDXContent(_ref) {\n  var components = _ref.components,\n    props = _objectWithoutProperties(_ref, _excluded);\n  return mdx(MDXLayout, _extends({}, layoutProps, props, {\n    components: components,\n    mdxType: \"MDXLayout\"\n  }), mdx(\"p\", null, \"We haven't done some live mob coding for a while so let's work through some Advent of Code or Exercism examples together.\"), mdx(\"p\", null, \"Elixir Updates and Discussion\"), mdx(\"p\", null, \"Lot's of wonderful things have been happening in the Elixir community (1.6 was released, Elixir is now on Google Cloud, etc). Let's discuss these and other important milestones.\"), mdx(\"p\", null, \"Beginners are more than welcome, and this a great chance to get started and get help from more experienced Elixir developers.\"), mdx(\"p\", null, \"Thanks to Pivotal Labs for hosting us.\"));\n}\n;\nMDXContent.isMDXComponent = true;","title":"Bitcoin and Languages Boundaries","path":"/events/bitcoin-and-languages-boundaries","date":"February 2018","description":"First Elixir meetup for 2018! Hope you all had a wonderful holiday and are excited about the future of our favourite programming ecosystem.","mainImage":{"publicURL":"/static/0b44ea323c48045cbfb4dfd0f6fc0444/bitcoin.jpg","childImageSharp":{"fluid":{"src":"/static/0b44ea323c48045cbfb4dfd0f6fc0444/14b42/bitcoin.jpg"}}}}},{"node":{"body":"var _excluded = [\"components\"];\nfunction _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\nfunction _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }\nfunction _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }\n/* @jsxRuntime classic */\n/* @jsx mdx */\n\nvar _frontmatter = {\n  \"path\": \"/events/real-world-elixir-hot-deployment-tracking-and-tools\",\n  \"title\": \"🌎 Real World Elixir 2: Hot Deploys, Tracking and Tools\",\n  \"date\": \"2017-11-01T00:00:00.000Z\",\n  \"time\": \"6:00 - 8:30pm\",\n  \"startDate\": \"2017-11-01T08:00+11:00\",\n  \"endDate\": \"2017-11-01T08:00+11:00\",\n  \"location\": \"pivotal-labs-location\",\n  \"organisers\": [\"josh-price\", \"james-sadler\", \"paul-fioravanti\"],\n  \"sponsors\": [\"alembic\", \"expert360\"],\n  \"talks\": [{\n    \"speaker\": \"luke-swithenbank\",\n    \"title\": \"Elixir Tooling: The Good and the Bad\",\n    \"description\": \"Luke will cover the myriad of amazing tools at our disposal in the Elixir and Erlang ecosystem.\\nWe personally can't wait for the new code formatter to arrive in Elixir 1.6, but he'll also cover Dialyzer and Dialyxir for type checking your code.\\nCredo for checking and ensuring consistent code style, HiPE, iEx and more.\\nHe'll also look at what opportunities there are for improvement in tooling and what you can do about it!\\n\",\n    \"slides\": null,\n    \"video\": null\n  }, {\n    \"speaker\": \"martin-stannard\",\n    \"title\": \"Session Tracking with GenServers\",\n    \"description\": \"Martin will deep dive into how Blake Education uses GenServers to track and analyse the interactions of high volumes of users on Reading Eggs and other products.\\nWe've looked at GenServers before and we know that they are used for managing state in your Elixir applications, but this will be a great introduction into a very practical use case for them.\\n\",\n    \"slides\": null,\n    \"video\": null\n  }, {\n    \"speaker\": \"jeffrey-chan\",\n    \"title\": \"Hot Deploying with Distillery and Docker\",\n    \"description\": \"Jeffrey will take us through the process of taking your Elixir or Phoenix application and deploying it with Distillery and maybe even a little bit of Docker.\\nHe'll also cover hot deployments which are some of the best kept secrets of the BEAM!\\n\",\n    \"slides\": null,\n    \"video\": null\n  }],\n  \"mainImage\": null,\n  \"images\": null,\n  \"description\": \"Another exciting lineup of Real World Elixir from expert practitioners this month. Also we have the privilege of welcoming not one but **two new speakers**!\"\n};\nvar layoutProps = {\n  _frontmatter: _frontmatter\n};\nvar MDXLayout = \"wrapper\";\nreturn function MDXContent(_ref) {\n  var components = _ref.components,\n    props = _objectWithoutProperties(_ref, _excluded);\n  return mdx(MDXLayout, _extends({}, layoutProps, props, {\n    components: components,\n    mdxType: \"MDXLayout\"\n  }), mdx(\"p\", null, \"Another exciting lineup of Real World Elixir from expert practitioners this month. Also we have the privilege of welcoming not one but \", mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"two new speakers\"), \"!\"), mdx(\"p\", null, \"Jeffrey will cover Hot Deployment with Distillery, a little Docker. Martin will show us how Blake use GenServers to track user interactions.\\nFinally Luke will cover the gamut of great tools in the Elixir and Erlang ecosystem and constrast to other languages and toolchains.\"), mdx(\"p\", null, \"Elixir and Erlang developers of all levels are more than welcome, and if you're a complete beginner or just curious, then this a great chance to get started and get help from more experienced Elixir developers.\"), mdx(\"p\", null, \"See you there,\"), mdx(\"p\", null, mdx(\"em\", {\n    parentName: \"p\"\n  }, \"Josh, James and Andrew\")));\n}\n;\nMDXContent.isMDXComponent = true;","title":"🌎 Real World Elixir 2: Hot Deploys, Tracking and Tools","path":"/events/real-world-elixir-hot-deployment-tracking-and-tools","date":"November 2017","description":"Another exciting lineup of Real World Elixir from expert practitioners this month. Also we have the privilege of welcoming not one but **two new speakers**!","mainImage":null}},{"node":{"body":"var _excluded = [\"components\"];\nfunction _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\nfunction _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }\nfunction _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }\n/* @jsxRuntime classic */\n/* @jsx mdx */\n\nvar _frontmatter = {\n  \"path\": \"/events/real-world-elixir\",\n  \"title\": \"🌏 Real World Elixir\",\n  \"date\": \"2017-10-02T00:00:00.000Z\",\n  \"time\": \"6:00 - 8:30pm\",\n  \"startDate\": \"2017-10-02T08:00+11:00\",\n  \"endDate\": \"2017-10-02T08:00+11:00\",\n  \"location\": \"pivotal-labs-location\",\n  \"organisers\": [\"josh-price\", \"james-sadler\", \"paul-fioravanti\"],\n  \"sponsors\": [\"alembic\", \"expert360\"],\n  \"talks\": [{\n    \"speaker\": \"mark-ratjens\",\n    \"title\": \"Transformers: Age of the Function Mark Ratjens\",\n    \"description\": \"Mark will take an introductory look at Functional Programming with Elixir through the lens of an experience OO practitioner.\\n\",\n    \"slides\": null,\n    \"video\": null\n  }, {\n    \"speaker\": \"dan-draper\",\n    \"title\": \"Why Expert360 Chose an Elixir Umbrella\",\n    \"description\": \"Expert360 has picked Elixir as a strategic technology choice, so Dan will tell us about some of the forces influencing this decision.\\nIncluding how using Elixir umbrella applications help the team deal with legacy systems while still delivering functionality quickly.\\n\",\n    \"slides\": null,\n    \"video\": null\n  }],\n  \"mainImage\": null,\n  \"images\": null,\n  \"description\": \"This month we've got some great talks lined up and from some new speakers too!\"\n};\nvar layoutProps = {\n  _frontmatter: _frontmatter\n};\nvar MDXLayout = \"wrapper\";\nreturn function MDXContent(_ref) {\n  var components = _ref.components,\n    props = _objectWithoutProperties(_ref, _excluded);\n  return mdx(MDXLayout, _extends({}, layoutProps, props, {\n    components: components,\n    mdxType: \"MDXLayout\"\n  }), mdx(\"p\", null, \"This month we've got some great talks lined up and from some new speakers too!\"), mdx(\"p\", null, \"Dan will tell us about some of the forces influencing Expert360's decision to double down on Elixir and the \\\"Modular Monolith\\\".\"), mdx(\"p\", null, \"Mark will take a look at Functional Programming with Elixir through the lens of an experience OO practitioner.\"), mdx(\"p\", null, \"Beginners are more than welcome, and this a great chance to get started and get help from more experienced Elixir developers.\"), mdx(\"p\", null, \"See you there!\"), mdx(\"p\", null, \"Josh, Andrew and James\"));\n}\n;\nMDXContent.isMDXComponent = true;","title":"🌏 Real World Elixir","path":"/events/real-world-elixir","date":"October 2017","description":"This month we've got some great talks lined up and from some new speakers too!","mainImage":null}},{"node":{"body":"var _excluded = [\"components\"];\nfunction _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\nfunction _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }\nfunction _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }\n/* @jsxRuntime classic */\n/* @jsx mdx */\n\nvar _frontmatter = {\n  \"path\": \"/events/elixir-hack-night\",\n  \"title\": \"Beginner Friendly Coding Night\",\n  \"date\": \"2017-09-06T00:00:00.000Z\",\n  \"time\": \"6:00 - 8:30pm\",\n  \"startDate\": \"2017-09-06T08:00+11:00\",\n  \"endDate\": \"2017-09-06T08:00+11:00\",\n  \"location\": \"pivotal-labs-location\",\n  \"organisers\": [\"josh-price\", \"james-sadler\", \"paul-fioravanti\"],\n  \"sponsors\": [\"alembic\", \"expert360\"],\n  \"talks\": [{\n    \"speaker\": \"placeholder\",\n    \"title\": \"Elixir Downunder\",\n    \"description\": \"In a format we've blatantly stolen borrowed from the end of year Cocoaheads trivia festival, we'll be throwing random questions at you which will stretch your noodles and maybe even teach you some interesting facts about Elixir or Erlang. Or maybe just programming in general.\",\n    \"photos\": \"https://alembic.com.au/static/dc946a1017e0665fccf2bd98abd98a67/c9121/elixir-sydney-july.jpg\",\n    \"slides\": \"https://speakerdeck.com/joshprice/elixir-performance-tuning\",\n    \"video\": \"https://www.youtube.com/watch?v=xTUK3uhFnlU\"\n  }],\n  \"mainImage\": null,\n  \"images\": null,\n  \"description\": \"It's been a while since we had a practical coding night, so bring your laptop and project ideas as we'll have plenty of experienced Alchemists to help you with whatever you're working on.\"\n};\nvar layoutProps = {\n  _frontmatter: _frontmatter\n};\nvar MDXLayout = \"wrapper\";\nreturn function MDXContent(_ref) {\n  var components = _ref.components,\n    props = _objectWithoutProperties(_ref, _excluded);\n  return mdx(MDXLayout, _extends({}, layoutProps, props, {\n    components: components,\n    mdxType: \"MDXLayout\"\n  }), mdx(\"p\", null, \"It's been a while since we had a practical coding night, so bring your laptop and bring your project ideas or questions and we'll have plenty of experienced Alchemists to help you with whatever you're working on.\"), mdx(\"p\", null, \"Beginners are more than welcome, and this a great chance to get started and get help from more experienced Elixir developers.\"), mdx(\"p\", null, \"See you there!\"), mdx(\"p\", null, \"Josh, Andrew and James\"));\n}\n;\nMDXContent.isMDXComponent = true;","title":"Beginner Friendly Coding Night","path":"/events/elixir-hack-night","date":"September 2017","description":"It's been a while since we had a practical coding night, so bring your laptop and project ideas as we'll have plenty of experienced Alchemists to help you with whatever you're working on.","mainImage":null}},{"node":{"body":"var _excluded = [\"components\"];\nfunction _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\nfunction _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }\nfunction _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }\n/* @jsxRuntime classic */\n/* @jsx mdx */\n\nvar _frontmatter = {\n  \"path\": \"/events/elixir-girls-celebration\",\n  \"title\": \"💃🏻 Elixir Girls Celebration\",\n  \"date\": \"2017-08-02T00:00:00.000Z\",\n  \"time\": \"6:00 - 8:30pm\",\n  \"startDate\": \"2017-08-02T08:00+11:00\",\n  \"endDate\": \"2017-08-02T08:00+11:00\",\n  \"location\": \"pivotal-labs-location\",\n  \"organisers\": [\"josh-price\", \"james-sadler\", \"paul-fioravanti\"],\n  \"sponsors\": [\"alembic\", \"expert360\"],\n  \"talks\": [{\n    \"speaker\": \"cath-jones\",\n    \"title\": \"Elixir Girls Recap\",\n    \"description\": \"Cath will tell us all the great stuff that happened at the first event,\\nwhat you can do to help mentor, and possibly hint at plans for the next one.\\n\",\n    \"slides\": null,\n    \"video\": null\n  }, {\n    \"speaker\": \"garrett-heinlen\",\n    \"title\": \"Service Contracts in Phoenix\",\n    \"description\": \"Phoenix 1.3 emphasises \\\"Contexts\\\" as a way of decoupling your application from your web interface.\\nThe next level of decoupling is using umbrella applications to enfore the service boundaries even further,\\nwhile still maintaining an easy to work with system.\\nGarrett will compare approaches and tell us why we need to separate the application from the web UI.\\n\",\n    \"slides\": null,\n    \"video\": null\n  }, {\n    \"speaker\": \"paul-fioravanti\",\n    \"title\": \"Enum.reduce\",\n    \"description\": \"Paul will talk about the powerful and fundamental function in Enum, `reduce`.\\nDefinitely something you'll want in your functional programming toolkit.\\n\",\n    \"slides\": null,\n    \"video\": null\n  }],\n  \"mainImage\": null,\n  \"images\": null,\n  \"description\": \"This month we are celebrating Elixir Girls which happened over the weekend and it was an amazing event!\"\n};\nvar layoutProps = {\n  _frontmatter: _frontmatter\n};\nvar MDXLayout = \"wrapper\";\nreturn function MDXContent(_ref) {\n  var components = _ref.components,\n    props = _objectWithoutProperties(_ref, _excluded);\n  return mdx(MDXLayout, _extends({}, layoutProps, props, {\n    components: components,\n    mdxType: \"MDXLayout\"\n  }), mdx(\"p\", null, \"This month we are celebrating Elixir Girls which happened over the weekend and it was an amazing event!\\nWe'll be celebrating this with a recap of the event, and some talks aimed at those new to Elixir and Phoenix and programming as well as consolidating knowledge from the event.\"), mdx(\"p\", null, \"Cath will recap everything that happened at the first Elixir Girls event and might even tell us what she has in store for the next one.\"), mdx(\"p\", null, \"Garrett will talk us through how to design maintainable Phoenix web applications with service contracts.\"), mdx(\"p\", null, \"Paul will reprise his talk about the Queen of functions \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"Enum.reduce\"), \", in case you missed it the first time or didn't catch all the subtle details.\"), mdx(\"p\", null, \"These talks will help you expand your knowledge of core Elixir and how to build more maintainable Phoenix apps.\"), mdx(\"p\", null, \"See you there!\"), mdx(\"p\", null, \"Josh, Andrew and James\"));\n}\n;\nMDXContent.isMDXComponent = true;","title":"💃🏻 Elixir Girls Celebration","path":"/events/elixir-girls-celebration","date":"August 2017","description":"This month we are celebrating Elixir Girls which happened over the weekend and it was an amazing event!","mainImage":null}},{"node":{"body":"var _excluded = [\"components\"];\nfunction _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\nfunction _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }\nfunction _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }\n/* @jsxRuntime classic */\n/* @jsx mdx */\n\nvar _frontmatter = {\n  \"path\": \"/events/api-gateways-requirements-makeovers-phoenix-upgrades\",\n  \"title\": \"API Gateways 🚪💂, Requirements Makeovers 💅 and Phoenix 🔥🐔\",\n  \"date\": \"2017-07-05T00:00:00.000Z\",\n  \"time\": \"6:00 - 8:30pm\",\n  \"startDate\": \"2017-07-05T08:00+11:00\",\n  \"endDate\": \"2017-07-05T08:00+11:00\",\n  \"location\": \"pivotal-labs-location\",\n  \"organisers\": [\"josh-price\", \"james-sadler\", \"paul-fioravanti\"],\n  \"sponsors\": [\"alembic\", \"expert360\"],\n  \"talks\": [{\n    \"speaker\": \"richard-heycock\",\n    \"title\": \"An Introduction to API Gateways\",\n    \"description\": \"\\\"API Gateways are a way of managing multiple resources and can be used to provide concerns such as authentication, request throttling, bot detection and all manner of things. This edifying and entertaining talk, given my one of the most inspiring and charismatic speakers of modern times, gives a brief introduction to this fascinating subject: what an API gateway really is, how you might use one, when you probably should use one and when you probably shouldn't. It'll be a roller coaster of a ride.\\\"\\n\",\n    \"slides\": null,\n    \"video\": null\n  }, {\n    \"speaker\": \"jon-rowe\",\n    \"title\": \"🔥🐔 1.2 ~> 🔥🐔 1.3\",\n    \"description\": \"Jon will take you through the steps for upgrading a Phoenix app and let us know what to watch out for!\\n\",\n    \"slides\": null,\n    \"video\": null\n  }, {\n    \"speaker\": \"robin-hilliard\",\n    \"title\": \"Requirements Makeover\",\n    \"description\": \"Robin will walk you through the process of converting a shopping list of random motherhood statements, acronyms and hopefully vague statements into useable requirements. Using thinly disguised real world examples, Robin will show you how to recognise common types of problem and describe the things developers will need to know to solve them.\\n\",\n    \"slides\": null,\n    \"video\": null\n  }],\n  \"mainImage\": null,\n  \"images\": null,\n  \"description\": \"This month we are widening our horizons beyond Elixir. We have two excellent but not Elixir-specific talks in addition to an Elixir talk.\"\n};\nvar layoutProps = {\n  _frontmatter: _frontmatter\n};\nvar MDXLayout = \"wrapper\";\nreturn function MDXContent(_ref) {\n  var components = _ref.components,\n    props = _objectWithoutProperties(_ref, _excluded);\n  return mdx(MDXLayout, _extends({}, layoutProps, props, {\n    components: components,\n    mdxType: \"MDXLayout\"\n  }), mdx(\"p\", null, \"This month we are widening our horizons beyond Elixir. We have two excellent but not Elixir-specific talks in addition to an Elixir talk.\"), mdx(\"p\", null, \"Richard will be giving a talk about API Gateways (with bonus wit and charisma) and why you should consider using one.\"), mdx(\"p\", null, \"Robin will take us on a journey to the promised land of beautifully distilled and clear requirements using \\\"thinly disguised real world examples\\\".\"), mdx(\"p\", null, \"Lastly, Jon will guide us through the steps to upgrade a Phoenix app from 1.2 to 1.3 while paying homage to the official emoji representation of our favorite web framework.\"), mdx(\"p\", null, \"Expect all talks to be peppered with entertaining anecdotes and delightful little segues that we can discuss over some tasty hot chips later in the evening.\"));\n}\n;\nMDXContent.isMDXComponent = true;","title":"API Gateways 🚪💂, Requirements Makeovers 💅 and Phoenix 🔥🐔","path":"/events/api-gateways-requirements-makeovers-phoenix-upgrades","date":"July 2017","description":"This month we are widening our horizons beyond Elixir. We have two excellent but not Elixir-specific talks in addition to an Elixir talk.","mainImage":null}},{"node":{"body":"var _excluded = [\"components\"];\nfunction _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\nfunction _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }\nfunction _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }\n/* @jsxRuntime classic */\n/* @jsx mdx */\n\nvar _frontmatter = {\n  \"path\": \"/events/umbrella-apps-and-elixir-macros\",\n  \"title\": \"⛱ Umbrella Apps and 💧 Elixir Macros\",\n  \"date\": \"2017-06-07T00:00:00.000Z\",\n  \"time\": \"6:00 - 8:30pm\",\n  \"startDate\": \"2017-06-07T08:00+11:00\",\n  \"endDate\": \"2017-06-07T08:00+11:00\",\n  \"location\": \"pivotal-labs-location\",\n  \"organisers\": [\"josh-price\", \"james-sadler\", \"paul-fioravanti\"],\n  \"sponsors\": [\"alembic\", \"expert360\"],\n  \"talks\": [{\n    \"speaker\": \"jon-rowe\",\n    \"title\": \"Umbrella Apps and Phoenix Microservices\",\n    \"description\": \"Jon will take us through the basics of Umbrella Apps and explore some interesting use cases for umbrella apps for building a microservice architecture with Phoenix.\\n\",\n    \"slides\": null,\n    \"video\": null\n  }, {\n    \"speaker\": \"qing-wu\",\n    \"title\": \"A Gentle Introduction to Elixir Macros\",\n    \"description\": \"Qing Wu will lead you gently into the land of Elixir macros, you'll be an expert before you know it!\\nElixir Macros are super powerful but confusing, this talk will give you a much better handle on them.\\n\",\n    \"slides\": null,\n    \"video\": null\n  }],\n  \"mainImage\": null,\n  \"images\": null,\n  \"description\": \"This month we'll be seeing how you can achieve microservices bliss without all the pain and examine the power and mystery of Elixir macros.\"\n};\nvar layoutProps = {\n  _frontmatter: _frontmatter\n};\nvar MDXLayout = \"wrapper\";\nreturn function MDXContent(_ref) {\n  var components = _ref.components,\n    props = _objectWithoutProperties(_ref, _excluded);\n  return mdx(MDXLayout, _extends({}, layoutProps, props, {\n    components: components,\n    mdxType: \"MDXLayout\"\n  }), mdx(\"p\", null, \"This month we'll be seeing how you can achieve microservices bliss without all the pain and examine the power and mystery of Elixir macros.\"), mdx(\"p\", null, \"Jon will take us through the basics of Umbrella Apps and explore some interesting use cases for umbrella apps for building a microservice architecture with Phoenix.\"), mdx(\"p\", null, \"Qing Wu will lead you gently into the land of Elixir macros, you'll be an expert before you know it!\"), mdx(\"p\", null, \"Beginners are more than welcome, and this a great chance to get started and get help from more experienced Elixir developers.\"), mdx(\"p\", null, \"We've got not one, but TWO brand new speakers this month which is fantastic! If you'd like to present something or see something presented next month just let us know.\"));\n}\n;\nMDXContent.isMDXComponent = true;","title":"⛱ Umbrella Apps and 💧 Elixir Macros","path":"/events/umbrella-apps-and-elixir-macros","date":"June 2017","description":"This month we'll be seeing how you can achieve microservices bliss without all the pain and examine the power and mystery of Elixir macros.","mainImage":null}},{"node":{"body":"var _excluded = [\"components\"];\nfunction _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\nfunction _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }\nfunction _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }\n/* @jsxRuntime classic */\n/* @jsx mdx */\n\nvar _frontmatter = {\n  \"path\": \"/events/cloud-deployment-and-nerves\",\n  \"title\": \"☁️ Cloud Deployment and 🚨 Nerves\",\n  \"date\": \"2017-05-03T00:00:00.000Z\",\n  \"time\": \"6:00 - 8:30pm\",\n  \"startDate\": \"2017-05-03T08:00+11:00\",\n  \"endDate\": \"2017-05-03T08:00+11:00\",\n  \"location\": \"pivotal-labs-location\",\n  \"organisers\": [\"josh-price\", \"james-sadler\", \"paul-fioravanti\"],\n  \"sponsors\": [\"alembic\", \"expert360\"],\n  \"talks\": [{\n    \"speaker\": \"josh-price\",\n    \"title\": \"Elixir Camp Recap\",\n    \"description\": \"Elixir was a really fantastic weekend. We had great talks, we had fires while we munched on delicious food (including 10hr smoked pulled pork).\\nJosh will give you a quick rundown of some of the highlights.\\n\",\n    \"slides\": null,\n    \"video\": null\n  }, {\n    \"speaker\": \"andrew-harvey\",\n    \"title\": \"Functional Firmware with Nerves (Part 2)\",\n    \"description\": \"In this talk we will keep exploring Nerves, the Elixir framework for building and deploying embedded software. Nerves is the easiest way to deploy Elixir to the Raspberry Pi or the Beaglebone.\\n\",\n    \"slides\": null,\n    \"video\": null\n  }, {\n    \"speaker\": \"dave-parry\",\n    \"title\": \"Cloud Deployment with Kubernetes, Terraform and Buildkite\",\n    \"description\": \"Dave will give a quick tour of his \\\"Fully Buzzword Compliant\\\" cloud deployment setup on AWS for deploying Elixir applications.\\n\",\n    \"slides\": null,\n    \"video\": null\n  }],\n  \"mainImage\": null,\n  \"images\": null,\n  \"description\": \"This month we'll be recapping the awesomeness that was Elixir Camp.\"\n};\nvar layoutProps = {\n  _frontmatter: _frontmatter\n};\nvar MDXLayout = \"wrapper\";\nreturn function MDXContent(_ref) {\n  var components = _ref.components,\n    props = _objectWithoutProperties(_ref, _excluded);\n  return mdx(MDXLayout, _extends({}, layoutProps, props, {\n    components: components,\n    mdxType: \"MDXLayout\"\n  }), mdx(\"p\", null, \"This month we'll be recapping the awesomeness that was Elixir Camp.\"), mdx(\"p\", null, \"Dave Parry will walk us through a fully buzzword compliant cloud deployment stack including Kubernetes, Terraform, AWS and Buildkite.\"), mdx(\"p\", null, \"Andrew will keep trucking and dive deeper into running Elixir on embedded hardware.\"));\n}\n;\nMDXContent.isMDXComponent = true;","title":"☁️ Cloud Deployment and 🚨 Nerves","path":"/events/cloud-deployment-and-nerves","date":"May 2017","description":"This month we'll be recapping the awesomeness that was Elixir Camp.","mainImage":null}},{"node":{"body":"var _excluded = [\"components\"];\nfunction _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\nfunction _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }\nfunction _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }\n/* @jsxRuntime classic */\n/* @jsx mdx */\n\nvar _frontmatter = {\n  \"path\": \"/events/elixir-camp\",\n  \"title\": \"⛺️ Elixir Camp\",\n  \"date\": \"2017-04-22T00:00:00.000Z\",\n  \"time\": \"6:00 - 8:30pm\",\n  \"startDate\": \"2017-04-22T08:00+11:00\",\n  \"endDate\": \"2017-04-22T08:00+11:00\",\n  \"location\": \"camp-wombaroo-location\",\n  \"organisers\": [\"josh-price\", \"james-sadler\", \"paul-fioravanti\"],\n  \"sponsors\": [\"alembic\", \"expert360\"],\n  \"talks\": [{\n    \"speaker\": \"rob-howard\",\n    \"title\": \"Beyond Simple Types in Elm\",\n    \"description\": \"Elm gives us the ability to use types to talk about the shape of our data. It's really tempting to just use simple things like String, Number, etc, but there's a bunch of ways we can tell Elm more about what we intend, and use types as a tool instead of just a constraint.\\n\",\n    \"slides\": null,\n    \"video\": null\n  }, {\n    \"speaker\": \"james-sadler\",\n    \"title\": \"Intro to GraphQL with Elixir\",\n    \"description\": \"GraphQL is a relevant up and coming API technology that offers API consumers much more flexibility than REST. It's a well-defined standard (as opposed to REST, which is convention driven) and supports streaming and subscriptions. Elixir is an ideal platform on which to build GraphQL APIs.\\n\",\n    \"slides\": null,\n    \"video\": null\n  }, {\n    \"speaker\": \"kevin-yank\",\n    \"title\": \"Introduction to Elm\",\n    \"description\": \"Just like Elixir challenges some of Ruby’s design decisions on the backend, Elm challenges aspects of the JavaScript language on the frontend to create a delightful developer experience. In this session, you’ll get a grand tour of the sources of developer happiness in Elm, and hopefully be convinced to give this exciting new language a closer look.\\n\",\n    \"slides\": null,\n    \"video\": null\n  }, {\n    \"speaker\": \"josh-price\",\n    \"title\": \"Intro to Phoenix 1.3 and Plug\",\n    \"description\": \"A talk to demystify the macro magic in Phoenix to demonstrate it's simplicity.\\n\",\n    \"slides\": null,\n    \"video\": null\n  }, {\n    \"speaker\": \"martin-stannard\",\n    \"title\": \"GenServer 101\",\n    \"description\": \"A quick rundown on GenServers and their implementation\\n\",\n    \"slides\": null,\n    \"video\": null\n  }, {\n    \"speaker\": \"alan-harper\",\n    \"title\": \"Whats the point of a process registry\",\n    \"description\": \"Thoughts on how to handle many many genservers doing tiny jobs.\\n\",\n    \"slides\": null,\n    \"video\": null\n  }, {\n    \"speaker\": \"jo-cranford\",\n    \"title\": \"Drinking the Elixir a story about breaking up a Rails Monolith\",\n    \"description\": \"A tale about a journey from a Rails Monolith into Elixir Microservices. Why we chose Elixir, and what we've learned along the way.\\n\",\n    \"slides\": null,\n    \"video\": null\n  }, {\n    \"speaker\": \"alex-tsirel\",\n    \"title\": \"Production Maintenance\",\n    \"description\": \"Right after you head to production lots of issues will appear. This talk will cover common issues with building/publishing releases, showing difference between production environment and production release, monitoring and zero-downtime deploy with upgrade or phased reboot.\\n\",\n    \"slides\": null,\n    \"video\": null\n  }],\n  \"mainImage\": null,\n  \"images\": null,\n  \"description\": \"Elixir Camp is a place for people interested in Elixir, Erlang and related technologies to gather, network, share ideas and generally have a great time.\"\n};\nvar layoutProps = {\n  _frontmatter: _frontmatter\n};\nvar MDXLayout = \"wrapper\";\nreturn function MDXContent(_ref) {\n  var components = _ref.components,\n    props = _objectWithoutProperties(_ref, _excluded);\n  return mdx(MDXLayout, _extends({}, layoutProps, props, {\n    components: components,\n    mdxType: \"MDXLayout\"\n  }), mdx(\"p\", null, \"Elixir Camp is a place for people interested in Elixir, Erlang and related technologies to gather, network, share ideas and generally have a great time. While there's a general focus on Elixir developers, techy people of any background are encouraged to attend.\"));\n}\n;\nMDXContent.isMDXComponent = true;","title":"⛺️ Elixir Camp","path":"/events/elixir-camp","date":"April 2017","description":"Elixir Camp is a place for people interested in Elixir, Erlang and related technologies to gather, network, share ideas and generally have a great time.","mainImage":null}},{"node":{"body":"var _excluded = [\"components\"];\nfunction _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\nfunction _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }\nfunction _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }\n/* @jsxRuntime classic */\n/* @jsx mdx */\n\nvar _frontmatter = {\n  \"path\": \"/events/phoenix-ecto-and-nerves\",\n  \"title\": \"🔥 Phoenix, Ecto and Nerves\",\n  \"date\": \"2017-04-05T00:00:00.000Z\",\n  \"time\": \"6:00 - 8:30pm\",\n  \"startDate\": \"2017-04-05T08:00+11:00\",\n  \"endDate\": \"2017-04-05T08:00+11:00\",\n  \"location\": \"pivotal-labs-location\",\n  \"organisers\": [\"josh-price\", \"james-sadler\", \"paul-fioravanti\"],\n  \"sponsors\": [\"alembic\", \"expert360\"],\n  \"talks\": [{\n    \"speaker\": \"andrew-harvey\",\n    \"title\": \"Functional Firmware with Nerves\",\n    \"description\": \"In this talk we will explore Nerves, the Elixir framework for building and deploying embedded software. Nerves is the easiest way to deploy Elixir to the Raspberry Pi or the Beaglebone.\\n\",\n    \"slides\": null,\n    \"video\": null\n  }, {\n    \"speaker\": \"james-sadler\",\n    \"title\": \"Ecto 2.1 Tips and Tricks\",\n    \"description\": \"If you want to talk to a datastore, you’re going to want to make friends with Ecto. It lets you compose query fragments with ease, and takes advantage of powerful Postgres features like Upserts. We’ll do a quick intro, and then take a deeper look at these new features.\\n\",\n    \"slides\": null,\n    \"video\": null\n  }, {\n    \"speaker\": \"josh-price\",\n    \"title\": \"What's New in Phoenix 1.3\",\n    \"description\": \"Phoenix 1.3 has just been released and there are lots of new changes. The project structure is significantly different and guide developers in the right direction for the best way to structure applications. We'll take a look at this and all the other cool new features.\\n\",\n    \"slides\": null,\n    \"video\": null\n  }],\n  \"mainImage\": null,\n  \"images\": null,\n  \"description\": \"With the new updates to Phoenix 1.3 and Ecto 2.1, we will take another look at the things we can do with Phoenix and Ecto.\"\n};\nvar layoutProps = {\n  _frontmatter: _frontmatter\n};\nvar MDXLayout = \"wrapper\";\nreturn function MDXContent(_ref) {\n  var components = _ref.components,\n    props = _objectWithoutProperties(_ref, _excluded);\n  return mdx(MDXLayout, _extends({}, layoutProps, props, {\n    components: components,\n    mdxType: \"MDXLayout\"\n  }), mdx(\"p\", null, \"With the new updates to Phoenix 1.3 and Ecto 2.1, we will take another look at the things we can do with Phoenix and Ecto.\"), mdx(\"p\", null, \"We will also show you some fun things you can do with Nerves, which lets you build embedded software for Raspberry Pis in Elixir.\"));\n}\n;\nMDXContent.isMDXComponent = true;","title":"🔥 Phoenix, Ecto and Nerves","path":"/events/phoenix-ecto-and-nerves","date":"April 2017","description":"With the new updates to Phoenix 1.3 and Ecto 2.1, we will take another look at the things we can do with Phoenix and Ecto.","mainImage":null}},{"node":{"body":"var _excluded = [\"components\"];\nfunction _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\nfunction _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }\nfunction _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }\n/* @jsxRuntime classic */\n/* @jsx mdx */\n\nvar _frontmatter = {\n  \"path\": \"/events/authentication-recursion-and-registries\",\n  \"title\": \"Authentication, Recursion and Registries\",\n  \"date\": \"2017-03-01T00:00:00.000Z\",\n  \"time\": \"6:00 - 8:30pm\",\n  \"startDate\": \"2017-03-01T08:00+11:00\",\n  \"endDate\": \"2017-03-01T08:00+11:00\",\n  \"location\": \"pivotal-labs-location\",\n  \"organisers\": [\"josh-price\", \"james-sadler\", \"paul-fioravanti\"],\n  \"sponsors\": [\"alembic\", \"expert360\"],\n  \"talks\": [{\n    \"speaker\": \"martin-stannard\",\n    \"title\": \"Using the New Registry in Elixir 1.4\",\n    \"description\": \"Elixir 1.4 introduces the new Process Registry module to help manage your processes in OTP. If you've attended our OTP introductory series then you'll be ready to join Martin as he shows us how we can use this in our Elixir OTP applications.\\n\",\n    \"slides\": null,\n    \"video\": null\n  }, {\n    \"speaker\": \"josh-price\",\n    \"title\": \"Getting Comfortable With Recursion\",\n    \"description\": \"You might not be used to writing code in a recursive style if you're coming from a more imperative language. Heard of Tail Recursion or Tail Call Optimisation, but not sure what it really means?\\nJosh will demystify writing recursive functions that are blazingly fast and help you avoid some of the traps.\\n\",\n    \"slides\": null,\n    \"video\": null\n  }, {\n    \"speaker\": \"sunil-gopinath\",\n    \"title\": \"Authentication with JWT\",\n    \"description\": \"Need to secure your Phoenix or Plug application? Not sure how JWT works? Well there are lots of options in Elixir for adding security to your webapp. Sunil will introduce JWT and the various options for add Authentication to your app.\\n\",\n    \"slides\": null,\n    \"video\": null\n  }],\n  \"mainImage\": null,\n  \"images\": null,\n  \"description\": \"This month we'll be talking about a topic that we haven't covered before, Authentication with JWT and their usage with Plugs, Joken and Phoenix.\"\n};\nvar layoutProps = {\n  _frontmatter: _frontmatter\n};\nvar MDXLayout = \"wrapper\";\nreturn function MDXContent(_ref) {\n  var components = _ref.components,\n    props = _objectWithoutProperties(_ref, _excluded);\n  return mdx(MDXLayout, _extends({}, layoutProps, props, {\n    components: components,\n    mdxType: \"MDXLayout\"\n  }), mdx(\"p\", null, \"This month we'll be talking about a topic that we haven't covered before, but is important for securing your webapps: Authentication with JWT and their usage with Plugs, Joken and Phoenix.\"), mdx(\"p\", null, \"We'll also be getting with writing Elixir in a recursive style. This may not be what you're used from other languages but it's pretty great in Elixir and Erlang. We'll learn how to write the ridiculously fast Elixir functions that are easy to read.\"), mdx(\"p\", null, \"Lastly we'll learn about what's new in Elixir 1.4 with a deep dive into the new Process Registry module.\"), mdx(\"p\", null, \"It's going to be a great meetup, so come along and join us!\"));\n}\n;\nMDXContent.isMDXComponent = true;","title":"Authentication, Recursion and Registries","path":"/events/authentication-recursion-and-registries","date":"March 2017","description":"This month we'll be talking about a topic that we haven't covered before, Authentication with JWT and their usage with Plugs, Joken and Phoenix.","mainImage":null}},{"node":{"body":"var _excluded = [\"components\"];\nfunction _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\nfunction _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }\nfunction _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }\n/* @jsxRuntime classic */\n/* @jsx mdx */\n\nvar _frontmatter = {\n  \"path\": \"/events/sydney-elixir-meetup\",\n  \"title\": \"Sydney Elixir Meetup\",\n  \"date\": \"2017-02-01T00:00:00.000Z\",\n  \"time\": \"6:00 - 8:30pm\",\n  \"startDate\": \"2017-02-01T08:00+11:00\",\n  \"endDate\": \"2017-02-01T08:00+11:00\",\n  \"location\": \"pivotal-labs-location\",\n  \"organisers\": [\"josh-price\", \"james-sadler\", \"paul-fioravanti\"],\n  \"sponsors\": [\"alembic\", \"expert360\"],\n  \"talks\": [{\n    \"speaker\": \"robin-hilliard\",\n    \"title\": \"Adventures in Dialyzer with Defunit\",\n    \"description\": \"Ever wondered how to add type safety to Elixir code? Robin will show you how!\\n\",\n    \"slides\": null,\n    \"video\": null\n  }, {\n    \"speaker\": \"nick-gunn\",\n    \"title\": \"Introduction to Supervisors\",\n    \"description\": \"Want to know more about supervisors? Nick has got the talk for you.\\n\",\n    \"slides\": null,\n    \"video\": null\n  }],\n  \"mainImage\": null,\n  \"images\": null,\n  \"description\": \"Nick Gunn will reveal the awesome power of Supervisors.\"\n};\nvar layoutProps = {\n  _frontmatter: _frontmatter\n};\nvar MDXLayout = \"wrapper\";\nreturn function MDXContent(_ref) {\n  var components = _ref.components,\n    props = _objectWithoutProperties(_ref, _excluded);\n  return mdx(MDXLayout, _extends({}, layoutProps, props, {\n    components: components,\n    mdxType: \"MDXLayout\"\n  }), mdx(\"p\", null, \"Nick Gunn will reveal the awesome power of Supervisors.\"), mdx(\"p\", null, \"Robin Hilliard will show us How to release Hex packages and tell us about his first: DefUnit\"), mdx(\"p\", null, \"We'll also discuss what has been happening in Elixir-land (like Elixir 1.4.1 and friends).\"), mdx(\"p\", null, \"Beginners are more than welcome, and this a great chance to get started and get help from more experienced Elixir developers.\"));\n}\n;\nMDXContent.isMDXComponent = true;","title":"Sydney Elixir Meetup","path":"/events/sydney-elixir-meetup","date":"February 2017","description":"Nick Gunn will reveal the awesome power of Supervisors.","mainImage":null}},{"node":{"body":"var _excluded = [\"components\"];\nfunction _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\nfunction _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }\nfunction _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }\n/* @jsxRuntime classic */\n/* @jsx mdx */\n\nvar _frontmatter = {\n  \"path\": \"/events/the-otp-edition\",\n  \"title\": \"The OTP Edition\",\n  \"date\": \"2016-12-07T00:00:00.000Z\",\n  \"time\": \"6:00 - 8:30pm\",\n  \"startDate\": \"2016-12-07T08:00+11:00\",\n  \"endDate\": \"2016-12-07T08:00+11:00\",\n  \"location\": \"pivotal-labs-location\",\n  \"organisers\": [\"josh-price\", \"james-sadler\", \"paul-fioravanti\"],\n  \"sponsors\": [\"alembic\", \"expert360\"],\n  \"talks\": [{\n    \"speaker\": \"josh-price\",\n    \"title\": \"Intro to Processes and the Actor model\",\n    \"description\": \"A Quick intro into Processes and the Actor model\\n\",\n    \"slides\": null,\n    \"video\": null\n  }, {\n    \"speaker\": \"garrett-heinlen\",\n    \"title\": \"Serving Generally\",\n    \"description\": \"A Primer into GenServers\\n\",\n    \"slides\": null,\n    \"video\": null\n  }],\n  \"mainImage\": null,\n  \"images\": null,\n  \"description\": \"We'll be covering OTP from the beginning in the last meetup for the year.\"\n};\nvar layoutProps = {\n  _frontmatter: _frontmatter\n};\nvar MDXLayout = \"wrapper\";\nreturn function MDXContent(_ref) {\n  var components = _ref.components,\n    props = _objectWithoutProperties(_ref, _excluded);\n  return mdx(MDXLayout, _extends({}, layoutProps, props, {\n    components: components,\n    mdxType: \"MDXLayout\"\n  }), mdx(\"p\", null, \"We'll be covering OTP from the beginning in the last meetup for the year.\"));\n}\n;\nMDXContent.isMDXComponent = true;","title":"The OTP Edition","path":"/events/the-otp-edition","date":"December 2016","description":"We'll be covering OTP from the beginning in the last meetup for the year.","mainImage":null}},{"node":{"body":"var _excluded = [\"components\"];\nfunction _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\nfunction _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }\nfunction _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }\n/* @jsxRuntime classic */\n/* @jsx mdx */\n\nvar _frontmatter = {\n  \"path\": \"/events/back-to-basics-part-2\",\n  \"title\": \"Back to Basics Part 2\",\n  \"date\": \"2016-11-02T00:00:00.000Z\",\n  \"time\": \"6:00 - 8:30pm\",\n  \"startDate\": \"2016-11-02T08:00+11:00\",\n  \"endDate\": \"2016-11-02T08:00+11:00\",\n  \"location\": \"pivotal-labs-location\",\n  \"organisers\": [\"josh-price\", \"james-sadler\", \"paul-fioravanti\"],\n  \"sponsors\": [\"alembic\", \"expert360\"],\n  \"talks\": [{\n    \"speaker\": \"placeholder\",\n    \"title\": \"Elixir Downunder\",\n    \"description\": \"In a format we've blatantly stolen borrowed from the end of year Cocoaheads trivia festival, we'll be throwing random questions at you which will stretch your noodles and maybe even teach you some interesting facts about Elixir or Erlang. Or maybe just programming in general.\",\n    \"photos\": \"https://alembic.com.au/static/dc946a1017e0665fccf2bd98abd98a67/c9121/elixir-sydney-july.jpg\",\n    \"slides\": \"https://speakerdeck.com/joshprice/elixir-performance-tuning\",\n    \"video\": \"https://www.youtube.com/watch?v=xTUK3uhFnlU\"\n  }],\n  \"mainImage\": null,\n  \"images\": null,\n  \"description\": \"We're going to keep going with our beginners focus this month continuing on from last month.\"\n};\nvar layoutProps = {\n  _frontmatter: _frontmatter\n};\nvar MDXLayout = \"wrapper\";\nreturn function MDXContent(_ref) {\n  var components = _ref.components,\n    props = _objectWithoutProperties(_ref, _excluded);\n  return mdx(MDXLayout, _extends({}, layoutProps, props, {\n    components: components,\n    mdxType: \"MDXLayout\"\n  }), mdx(\"p\", null, \"We're going to keep going with our beginners focus this month continuing on from last month.\"), mdx(\"p\", null, \"We'll be looking at some more practical exercises and tackling them as a group and also in pairs.\"));\n}\n;\nMDXContent.isMDXComponent = true;","title":"Back to Basics Part 2","path":"/events/back-to-basics-part-2","date":"November 2016","description":"We're going to keep going with our beginners focus this month continuing on from last month.","mainImage":null}},{"node":{"body":"var _excluded = [\"components\"];\nfunction _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\nfunction _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }\nfunction _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }\n/* @jsxRuntime classic */\n/* @jsx mdx */\n\nvar _frontmatter = {\n  \"path\": \"/events/back-to-basics-part-1\",\n  \"title\": \"Back to Basics Part 1\",\n  \"date\": \"2016-10-05T00:00:00.000Z\",\n  \"time\": \"6:00 - 8:30pm\",\n  \"startDate\": \"2016-10-05T08:00+11:00\",\n  \"endDate\": \"2016-10-05T08:00+11:00\",\n  \"location\": \"pivotal-labs-location\",\n  \"organisers\": [\"josh-price\", \"james-sadler\", \"paul-fioravanti\"],\n  \"sponsors\": [\"alembic\", \"expert360\"],\n  \"talks\": [{\n    \"speaker\": \"james-sadler\",\n    \"title\": \"Pattern Matching\",\n    \"description\": \"Pattern Matching\\n\",\n    \"slides\": null,\n    \"video\": null\n  }, {\n    \"speaker\": \"geoff-hodgson\",\n    \"title\": \"Intro to Phoenix\",\n    \"description\": \"Intro to Phoenix\\n\",\n    \"slides\": null,\n    \"video\": null\n  }, {\n    \"speaker\": \"josh-price\",\n    \"title\": \"Mix, ExUnit and Advanced Pattern Matching\",\n    \"description\": \"Mix, ExUnit and Advanced Pattern Matching\\n\",\n    \"slides\": null,\n    \"video\": null\n  }, {\n    \"speaker\": \"andrew-harvey\",\n    \"title\": \"Elixir Syntax Basics\",\n    \"description\": \"Elixir Syntax Basics\\n\",\n    \"slides\": null,\n    \"video\": null\n  }, {\n    \"speaker\": \"josh-price\",\n    \"title\": \"Intro to Plugs\",\n    \"description\": \"Intro to Plugs\\n\",\n    \"slides\": null,\n    \"video\": null\n  }],\n  \"mainImage\": null,\n  \"images\": null,\n  \"description\": \"This month we'll be going back to basics as a way to help those new to Elixir to get up to speed quickly. We'll be doing short talks with Q&A.\"\n};\nvar layoutProps = {\n  _frontmatter: _frontmatter\n};\nvar MDXLayout = \"wrapper\";\nreturn function MDXContent(_ref) {\n  var components = _ref.components,\n    props = _objectWithoutProperties(_ref, _excluded);\n  return mdx(MDXLayout, _extends({}, layoutProps, props, {\n    components: components,\n    mdxType: \"MDXLayout\"\n  }), mdx(\"p\", null, \"This month we'll be going back to basics as a way to help those new to Elixir to get up to speed quickly. We'll be doing short talks with Q&A.\"));\n}\n;\nMDXContent.isMDXComponent = true;","title":"Back to Basics Part 1","path":"/events/back-to-basics-part-1","date":"October 2016","description":"This month we'll be going back to basics as a way to help those new to Elixir to get up to speed quickly. We'll be doing short talks with Q&A.","mainImage":null}},{"node":{"body":"var _excluded = [\"components\"];\nfunction _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\nfunction _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }\nfunction _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }\n/* @jsxRuntime classic */\n/* @jsx mdx */\n\nvar _frontmatter = {\n  \"path\": \"/events/august-meetup\",\n  \"title\": \"August Meetup\",\n  \"date\": \"2016-08-03T00:00:00.000Z\",\n  \"time\": \"6:00 - 8:30pm\",\n  \"startDate\": \"2016-08-03T08:00+11:00\",\n  \"endDate\": \"2016-08-03T08:00+11:00\",\n  \"location\": \"pivotal-labs-location\",\n  \"organisers\": [\"josh-price\", \"james-sadler\", \"paul-fioravanti\"],\n  \"sponsors\": [\"alembic\", \"expert360\"],\n  \"talks\": [{\n    \"speaker\": \"josh-price\",\n    \"title\": \"Better APIs with GraphQL\",\n    \"description\": \"Making better APIs with GraphQL\\n\",\n    \"slides\": null,\n    \"video\": null\n  }, {\n    \"speaker\": \"alex-tsirel\",\n    \"title\": \"Migrating an App from Ruby to Elixir\",\n    \"description\": \"How to migrate your Ruby App into Elixir\\n\",\n    \"slides\": null,\n    \"video\": null\n  }],\n  \"mainImage\": null,\n  \"images\": null,\n  \"description\": \"Thanks to Pivotal Labs for hosting, we'll be road testing the slightly cosier board room this month.\"\n};\nvar layoutProps = {\n  _frontmatter: _frontmatter\n};\nvar MDXLayout = \"wrapper\";\nreturn function MDXContent(_ref) {\n  var components = _ref.components,\n    props = _objectWithoutProperties(_ref, _excluded);\n  return mdx(MDXLayout, _extends({}, layoutProps, props, {\n    components: components,\n    mdxType: \"MDXLayout\"\n  }), mdx(\"p\", null, \"Thanks to Pivotal Labs for hosting, we'll be road testing the slightly cosier board room this month.\"));\n}\n;\nMDXContent.isMDXComponent = true;","title":"August Meetup","path":"/events/august-meetup","date":"August 2016","description":"Thanks to Pivotal Labs for hosting, we'll be road testing the slightly cosier board room this month.","mainImage":null}},{"node":{"body":"var _excluded = [\"components\"];\nfunction _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\nfunction _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }\nfunction _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }\n/* @jsxRuntime classic */\n/* @jsx mdx */\n\nvar _frontmatter = {\n  \"path\": \"/events/july-meetup\",\n  \"title\": \"July Meetup\",\n  \"date\": \"2016-07-06T00:00:00.000Z\",\n  \"time\": \"6:00 - 8:30pm\",\n  \"startDate\": \"2016-07-06T08:00+11:00\",\n  \"endDate\": \"2016-07-06T08:00+11:00\",\n  \"location\": \"pivotal-labs-location\",\n  \"organisers\": [\"josh-price\", \"james-sadler\", \"paul-fioravanti\"],\n  \"sponsors\": [\"alembic\", \"expert360\"],\n  \"talks\": [{\n    \"speaker\": \"andrew-harvey\",\n    \"title\": \"Discussion of all the new things\",\n    \"description\": \"Elixir 1.3, Ecto 2.0 and Phoenix 1.2\"\n  }, {\n    \"speaker\": \"alan-milligan\",\n    \"title\": \"A Gentle introduction to the Erlang Ecosystem\"\n  }, {\n    \"speaker\": \"alex-tsirel\",\n    \"title\": \"Hassle free deployment with EXRM and edeliver\"\n  }],\n  \"mainImage\": null,\n  \"images\": null,\n  \"description\": \"We're back at Pivotal Labs again this month, they're central and food/drinks will be provided.\"\n};\nvar layoutProps = {\n  _frontmatter: _frontmatter\n};\nvar MDXLayout = \"wrapper\";\nreturn function MDXContent(_ref) {\n  var components = _ref.components,\n    props = _objectWithoutProperties(_ref, _excluded);\n  return mdx(MDXLayout, _extends({}, layoutProps, props, {\n    components: components,\n    mdxType: \"MDXLayout\"\n  }), mdx(\"p\", null, \"We're back at Pivotal Labs again this month, they're central and food/drinks will be provided.\"));\n}\n;\nMDXContent.isMDXComponent = true;","title":"July Meetup","path":"/events/july-meetup","date":"July 2016","description":"We're back at Pivotal Labs again this month, they're central and food/drinks will be provided.","mainImage":null}},{"node":{"body":"var _excluded = [\"components\"];\nfunction _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\nfunction _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }\nfunction _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }\n/* @jsxRuntime classic */\n/* @jsx mdx */\n\nvar _frontmatter = {\n  \"path\": \"/events/june-meetup\",\n  \"title\": \"June Meetup\",\n  \"date\": \"2016-06-01T00:00:00.000Z\",\n  \"time\": \"6:00 - 8:30pm\",\n  \"startDate\": \"2016-06-01T08:00+11:00\",\n  \"endDate\": \"2016-06-01T08:00+11:00\",\n  \"location\": \"pivotal-labs-location\",\n  \"organisers\": [\"josh-price\", \"james-sadler\", \"paul-fioravanti\"],\n  \"sponsors\": [\"alembic\", \"expert360\"],\n  \"talks\": [{\n    \"speaker\": \"andrew-harvey\",\n    \"title\": \"Getting PG2 working on AWS\",\n    \"description\": \"A lightning talk on getting PG2 (how Phoenix talks between nodes for PubSub) working on AWS\"\n  }, {\n    \"speaker\": \"josh-price\",\n    \"title\": \"ElixirConf EU part 1\",\n    \"description\": \"Sharing from ElixirConf EU\"\n  }, {\n    \"speaker\": \"james-sadler\",\n    \"title\": \"ElixirConf EU part 2\",\n    \"description\": \"Sharing from ElixirConf EU\"\n  }],\n  \"mainImage\": null,\n  \"images\": null,\n  \"description\": \"We've moved to Pivotal Labs, they're nice and central and pizza will still be provided.\"\n};\nvar layoutProps = {\n  _frontmatter: _frontmatter\n};\nvar MDXLayout = \"wrapper\";\nreturn function MDXContent(_ref) {\n  var components = _ref.components,\n    props = _objectWithoutProperties(_ref, _excluded);\n  return mdx(MDXLayout, _extends({}, layoutProps, props, {\n    components: components,\n    mdxType: \"MDXLayout\"\n  }), mdx(\"p\", null, \"New Venue\"), mdx(\"p\", null, \"We've moved to Pivotal Labs, they're nice and central and pizza will still be provided.\"));\n}\n;\nMDXContent.isMDXComponent = true;","title":"June Meetup","path":"/events/june-meetup","date":"June 2016","description":"We've moved to Pivotal Labs, they're nice and central and pizza will still be provided.","mainImage":null}},{"node":{"body":"var _excluded = [\"components\"];\nfunction _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\nfunction _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }\nfunction _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }\n/* @jsxRuntime classic */\n/* @jsx mdx */\n\nvar _frontmatter = {\n  \"path\": \"/events/may-meetup\",\n  \"title\": \"May Meetup\",\n  \"date\": \"2016-05-04T00:00:00.000Z\",\n  \"time\": \"6:00 - 8:30pm\",\n  \"startDate\": \"2016-05-04T08:00+11:00\",\n  \"endDate\": \"2016-05-04T08:00+11:00\",\n  \"location\": \"pivotal-labs-location\",\n  \"organisers\": [\"josh-price\", \"james-sadler\", \"paul-fioravanti\"],\n  \"sponsors\": [\"alembic\", \"expert360\"],\n  \"talks\": [{\n    \"speaker\": \"andrew-harvey\",\n    \"title\": \"Generative Grammars with VoxPop\",\n    \"description\": \"Generative Grammars with VoxPop\"\n  }, {\n    \"speaker\": \"josh-price\",\n    \"title\": \"The Future of Elixir\",\n    \"description\": \"Discussion of new features in 1.3 + Cloud Deployment and Buildpack Internals\"\n  }],\n  \"mainImage\": null,\n  \"images\": null,\n  \"description\": \"We'll be at Booodl again this month.\"\n};\nvar layoutProps = {\n  _frontmatter: _frontmatter\n};\nvar MDXLayout = \"wrapper\";\nreturn function MDXContent(_ref) {\n  var components = _ref.components,\n    props = _objectWithoutProperties(_ref, _excluded);\n  return mdx(MDXLayout, _extends({}, layoutProps, props, {\n    components: components,\n    mdxType: \"MDXLayout\"\n  }), mdx(\"p\", null, \"We'll be at Booodl again this month.\\nThere's space for short demos of something you're working on or a lightning talk if you'd like to present something.\"));\n}\n;\nMDXContent.isMDXComponent = true;","title":"May Meetup","path":"/events/may-meetup","date":"May 2016","description":"We'll be at Booodl again this month.","mainImage":null}}]},"siteYaml":{"eventsTitle":"Past Events"},"defaultThumbnail":{"publicURL":"/static/c97554d96d48b3de489ca41d98b96746/default_event_thumbnail.jpg"}}}