RakNet game networking protocol in Elixir
We’ve open-sourced the most important component of the massive multiplayer server we use for the X-Plane flight simulator: an implementation of the RakNet protocol.
You can find it on GitHub, under the MIT license: https://github.com/X-Plane/elixir-raknet
A bit of background:
RakNet is a popular C++ library for doing game networking. It provides things like stateful connections, client clock synchronization (the bane of every network game programmers’ existence), and both reliable and unreliable UDP transmissions, so you can choose how much latency your packets can handle.
This is pretty niche stuff, but maybe it’ll be useful for someone else. Reverse-engineering this stuff from the RakNet source was, uh, a bit of a pain. 😄
EctoExtras - simple helper functions missing from the default Ecto implementation
EctoExtras is a set of simple helper functions for Ecto.Repo and Ecto.Query that I find missing from the default implementation. https://github.com/pawurb/ecto_extras
A guide to event handling in Elixir
6 ways of handling events in Elixir systems - a high level overview with trade-offs for each approach.
https://mkaszubowski.com/2021/01/09/elixir-event-handling.html
Elixir for Beginners: From Pipes to Pattern Matching and Beyond
We have collected all the tips, techniques, and patterns you need to do beginner-level Elixir programming in one article. Learn about higher-order functions, pattern matching, recursion, and more.
ElixirCasts 128: Using Twilio with Elixir
In this episode we’ll explore how to send text messages from an Elixir application. We’ll use Phoenix LiveView for our UI and Twilio to deliver our messages.
ThinkingElixir 030: Mutation Testing using Muzak with Devon Estes
In episode 30 of Thinking Elixir, we talk with Devon Estes who has created a new Elixir mutation testing library called Muzak. Devon joins us to explain what mutation testing is and how it can help development teams in organizations move faster and with greater confidence. We cover when a project can benefit from it, the challenges of offering a PRO library version, where Muzak is going in the future, and more!
Elixir in 2021: The Now, The Tomorrow, The Future
In a new article by Michal Buszkiewicz, find out whether & why there’ll ever be an Elixir 2.0, and learn about the philosophy behind the language’s development and its current state in 2021.
Early alpha "Create a cryptocurrency bot in Elixir" ebook released!
I’m proud to release an early alpha version of my book: https://leanpub.com/create-a-cryptocurrency-trading-bot-in-elixir Feel free to grill it as much as you want - any feedback appreciated, that’s the only way to get it better really ;)
Enjoy
Advent Of Code makes me a better programmer
Advent Of Code is a yearly coding challenge offered by Eric Wastl for the Christmas season. In this article I will share my AOC takeaways as an Elixir programmer.
https://www.christianblavier.com/advent-of-code-makes-me-a-better-programmer/
Extracting LiveView Logic into LiveComponents
How to extract LiveView logic into a LiveComponent, and how to exchange data both ways.
https://s2g.io/extracting-liveview-logic-into-livecomponents
How to connect Pow and Live View in your Phoenix project
Wrote a short blogpost about connecting Pow and Live View in a Phoenix project. Basically, it is a summary of existing knowledge from the Live View documentation and a long thread in the Elixir forum. I hope it is helpful for others, that enjoy Pow as much as I do.
https://dev.to/oliverandrich/how-to-connect-pow-and-live-view-in-your-phoenix-project-1ga1
11th episode - Autostarting trading strategy - crypto trading in Elixir
11th video in the series about building cryptocurrency trading bot in Elixir - this time we will focus on autostarting, stopping, and graceful shutdown of our naive trading strategy.
Link: https://www.youtube.com/watch?v=Gm2v3E8fmAM&list=PLxsE19GnjC5Nv1CbeKOiS5YqGqw35aZFJ&index=11
Serving open street map vector tiles with elixir and phoenix
https://dev.to/dkuku/serving-open-street-map-vector-tiles-with-elixir-and-phoenix-40ip In this tutorial I’ll use a file has bundled the assets as *.pbf because it’s the most complicated format to set up. With images you don’t need any plugins for leaflet and the rendering should be much faster in user browser.
IntelliJ Elixir v11.9.0
Changelog
Enhancements
-
Make plugin updatable without a restart when installing from the JetBrains Marketplace. (If installing from file on GitHub you still need to restart due to a limitation in the JetBrains API.). JetBrains refers to this as a Dynamic Plugin.
-
Convert
DepsWatcherfrom project component to project listener -
Convert
Watcherfrom module component to project listener - Make org.elixir_lang.packageManager extension point dynamic
-
Convert
-
Remove unnecessary
assert. -
Replace
ifwithwhen -
Include
asdtool version Prevent me screwing up the quoter cache using the wrong elixir version again. -
Update gradle project
-
gradlew6.7.1 -
org.jetbrains.intellij0.6.3 -
org.jetbrains.kotlin.jvm1.3.70 -
de.undercouch.downloadto4.4.1
-
- Update to GitHub Environment Files
-
Update CI to Elixir 1.11.2 and Erlang 23.1
-
Quoting (for verification of correspondences between plugin and Elixir native lexer and parser.)
-
Port elixir-lang/elixir#9725
- Indentations for sigil binaries with complex content. Makes sure the indentation metadata is added to sigils that have content with metadata already.
- Quote charlist the same as string when used for a quoted atom
- Port elixir-lang/elixir@e89e9d874bf803379d729a3bae185052a5323a85
-
Add sigil delimiter to metadata
Ports elixir-lang/elixir#9671
- Have 3 character delimiter for heredocs
-
Add
no_parens: truemetadata Port elixir-lang/elixir@8e7befb1087bd37d5acb883e21925b1c0eb0a55f
-
Port elixir-lang/elixir#9725
- Remove elixir-lang parsing tests for files that don’t exist in Elixir 1.11
-
Add missing
@Deprecatedto match overridden method - Format expected and actual quoted Makes the diff not be a one-liner. so easier to spot the difference.
-
Convert
Quoterto Kotlin - Regenerate Parser for newer GrammarParser version.
- Port elixir-lang/elixir@1e4e05ef78b3105065f0a313bd0e1e78b2aa973e
-
Quoting (for verification of correspondences between plugin and Elixir native lexer and parser.)
-
Rewrote the
DocumentationProviderso it no longer relies on invokingmix(which I admit was more like a hack than a real solution). This now works so quickly that it actually makes sense to show docs on mouse hover.- It can get the documentation from both the source code and decompiled .beam files.
- Decompilation of documentation was implemented according to EEP-48.
-
The experience on navigating through decompiled file has also been improved a bit
-
See the
@moduledocand@docs - See if a function has been deprecated
-
See the original signature of the function (instead of just
p0,p1, …).
-
See the
Bug Fixes
-
Fix deprecation warnings for IntelliJ IDEA 2020.2
-
Replace
fileTypeFactoryextensions withfileType -
Convert
fileTypes to Kotlin -
Replace uses of deprecated
Project#baseDir -
Replace uses of deprecated
ContainerUtil.newHashMap -
Replace
defaultLiveTemplatesProviderwithdefaultLiveTemplates -
spaceExistanceTypeBetweenTokensreplaced withspaceExistenceTypeBetweenTokens -
Replace
ListCellRendererWrapperwithSimpleListCellRenderer -
Replace
StdFileTypes.PLAIN_TEXTwithFileTypes.PLAIN_TEXT -
Replace
LanguageSubstitutors.INSTANCEwithgetInstance() -
Replace
ReportMessages.ERROR_REPORTwithReportMessages.getErrorReport() -
Replace
DefaultProgramRunnerwithGenericProgramRunner- Have only one runner for all configurations in plugin since body of runner was all the same for non-debug.
-
Don’t override deprecated
flushBufferBeforeTerminating() -
Don’t override deprecated
acceptsFile -
Override
initExtra(Project)instead ofinitExtra(Project, MessageBus, Engine) -
Replace
NamedFoldingDescriptorwithFoldingDescriptor-
Convert
folding.Builderto Kotlin
-
Convert
-
Replace
filewithvaluefor@Storageannotation -
Replace
checkBox(fieldName, title)withcheckBox(title, getter, setter) -
Replace
com.intellij.util.contains.Predicatewithjava.util.function.Predicate -
Replace
CodeStyleSettingsManagerwithCodeStyle -
Replace
Comparing.equalwithObjects.equals -
Replace
UsageType(String)withUsageType(Supplier) -
Replace
PluginManagerwithPluginManagerCore -
Replace
WakValueHashMapwithcreateWakeValueMap -
Don’t pass
PasstoLineMarkerInfo -
Replace
newArrayListWithCapacitywithArrayList -
Replace
newIdentityHashMapwithIdentityHashMap -
Replace
RefElement#elementwith#psiElement -
Pass
columnMargintosetupCheckboxColumn -
Extensions.getExtensions(name)->name.extensionList -
Extensions.findExtension->ExtensionPointName.findExtensionOrFail -
Object->Any -
Replace
choseAndSetSdkwithSdkPopupFactory
-
Replace
-
Fix error reporting formatting
- Fix new lines around excerpts so that code blocks quote correctly
- Use FILE:LINE format for excerpt location, so it can be used in editors for rapid lookup.
- Separate title from message
-
Remove use of
ErrorBean - Pass project for LevelPropertyPusher DumbModeTask
-
Don’t use constructor injection for
SetupSDKNotificationProvider -
Don’t use
AnnotationHolder::create*APIs and useAnnotationBuilderinstead.-
Convert
Annotators to Kotlin
-
Convert
-
Use
logger.errordirectly instead ofLogMessageEx
- Fix Atom annotator to only annotator within current element. Annotation keyword pair’s key and colon instead of annotating the keyword key and the colon outside of it.
-
Fix
Macroparsing inDbgI-
ifAccessToStringI missed taking the 3rd element of the tuple to get[Access, :get]and was checking the outer tuple directly.-
Convert
beam.assembly.ParserDefinitionto Kotlin
-
Convert
-
ifWhenToStringwhereasshould beas?
-
-
Suppress unused variables for
TODO()s -
Remove unnecessary
Linechunk dependency onAtomchunk -
Switch unused
unsignedIntvalues to_as Kotlin doesn’t support_name -
Use
keyinstead of environment forcomputeIfAbsent - Replace lambda with constructor reference
-
Remove unnecessary
!!s -
Replace
mapIndexedwithmapbecauseindexis unused -
Remove
openthat has no effect inobject -
Fix
isoverrides by converting to Kotlin -
Remove unused
CallfromImplementation.andCallDefinitionClause.elementDescription(Call, ElementDescriptionLocation). -
Don’t shadow
resolveResultListinaddToResolveResultList -
Remove useless
?: -
Remove unnecessary
!= null - Fix named argument calling by using super argument name
-
Change
Float.from(ByteArray, Int)toTODO()as implementation is invalid. -
Remove unused
ModuleChooserDialog -
Setup
EncodingManagerforParsingTestCase -
Remove redundant
internal - Don’t highlight resolved callables along with referrers Newest annotation API asserts that the annotator only annotates the PsiElement being visited, so can’t highlight the resolved call definitions at the same time anymore.
-
Differentiate signs, unary +/-, and addition/subtraction in lexer.
Fix parsing of
-1forcaseclauses (#1316) by more strictly parsing decimal exponent signs differently than addition/subtraction and differently from unary+and-. No longer have a “dual” operation emitted from the lexer like the Elixir native lexer and instead use specific tokens for each use case so that the parser doesn’t need to decide on the operation. - Heredoc with escapable newlines (#1843) Heredocs allow the final newline to be escaped so you can write a heredoc in the code, but have no newlines in the string term at runtime.
- Fix terminators docs to show closing version and not opening version
-
Protect against
IndexOutOfBoundsfromhighlighterIteratorinQuoteHandler.
Elixir Wizards: Steve Domin on Innovating Travel APIs
This week on Elixir Wizards, we talk with Steve Domin, CEO and Co-Founder of Duffel.com: https://smartlogic.io/podcast/elixir-wizards/s5e6-domin/
Grax 0.1: a graph data mapper for Elixir
Grax is a light-weight graph data mapper which maps RDF graph data on to Elixir structs, like Ecto.Schemas for graph data.
https://github.com/rdf-elixir/grax
Read all about it in the guide: https://rdf-elixir.dev/grax/
Use the new Enum type in Ecto 3.5
Enums are a great way to safely store user roles, record status updates, and many other things in your database. Ecto 3.5 added Ecto.Enum which makes it easier than ever to persist enums to your database.
https://dennisbeatty.com/use-the-new-enum-type-in-ecto-3-5.html
Mutiny: Simple database immutability
Need database-level assurance that certain records are immutable—that is to say, unable to be UPDATEd once INSERTed? Mutiny is glad to oblige. https://newaperio.com/blog/mutiny
Temple v0.6.0-rc.0 released!
Just released the first RC of Temple v0.6.0! Please check out the diff and try it out to report any issues before I make the official release.
Main improvements are
- Phoenix LiveView compatible
- Improved component API
Diff: https://diff.hex.pm/diff/temple/0.6.0-alpha.4..0.6.0-rc.0
