Skip to content

Instantly share code, notes, and snippets.

View sb8244's full-sized avatar

Stephen Bussey sb8244

View GitHub Profile
@sb8244
sb8244 / caching.ex
Last active February 26, 2024 16:09
Local/Distributed Caching
defmodule MyApp.AccountLookup.Cache do
@moduledoc """
Provides a cache that can be used for account lookups. This cache is backed by
Cachex for local storage and pg2 for remote distribution. Keys are set to expire
after 7-10 days (randomly distributed) in order to prevent stale data in our cache
over a long time period.
"""
use Cachex.DistributedCache
@sb8244
sb8244 / cluster_loader_balancer.ex
Created July 30, 2019 19:59
ClusterLoadBalancer for balancing anything (WebSocket) across a cluster
# We use this ClusterLoadBalancer to prevent hot nodes in our load balanced setup.
# The WebSockets are provided by Phoenix through the PushEx application https://github.com/pushex-project/pushex/
# The load balancer's `Worker` module is where the bulk of the cluster orchestration happens, using pg2 for cross node communication
defmodule ClusterLoadBalancer.Behavior do
@moduledoc """
Behavior for implementing a ClusterLoadBalancer compatible tool.
"""
@callback count() :: number
public class ImmutableCounter {
private final int counter;
public ImmutableCounter(int num) {
this.counter = num;
}
public int getCount() {
return this.counter;
}
@sb8244
sb8244 / ImmutableDemo.java
Created September 12, 2023 05:17
Immutability Lecture (Activity 1)
import java.util.HashMap;
// This class is broken, follow the TODOs
public class ImmutableDemo {
// TODO: How to prevent external actors from accessing the map directly?
public HashMap<String,String> map;
public ImmutableDemo() {
this.map = new HashMap<String, String>();
this.map.put("Important", "OKAY");
defmodule Super.RepoTest do
use Super.DataCase, async: true
require Logger
@skipped_schemas [UserService.User]
defp tenant_schemas do
{:ok, mods} = :application.get_key(:super, :modules)
Enum.map(mods, fn mod ->
defmodule TestRouter do
def build(routes) do
contents =
quote do
use Plug.Router
plug :match
plug :dispatch
Enum.map(unquote(Macro.escape(routes)), fn %{match: match, assign: assign} ->
var links = document.getElementsByTagName('a');
var params = new URLSearchParams(window.location.search);
var utmParams = {};
params.forEach(function (val, name) {
if (name.startsWith('utm_')) {
utmParams[name] = val;
}
});
@sb8244
sb8244 / sso.json
Last active May 19, 2022 16:20
Clove SSO schema
{
"user": {
"id": "(Required) String: The ID of the user logging into Clove",
"email": "String: The email address of the user",
"name": "String: Full name of the user",
"given_name": "String: First name of the user",
"family_name": "String: Last name of the user",
"custom_data": "Map: Arbitrary data container for your application",
"organization": {
"id": "(Required if organization key present) String: The ID of the organization this user belongs to",
export const SpaceLayoutEditor = {
// Not important for the integration, just something for my specific use case
recentItems: [],
mounted() {
// IMPORTANT LINE: LiveView -> React data flow
this.handleEvent("react.update_items", ({ items }: { items: string }) => {
const newItems: SpaceItem[] = JSON.parse(items)
this.mountEditor(newItems)
})
@sb8244
sb8244 / 1_hooks.ts
Last active April 13, 2022 17:52
Example hooks + React mounter for LiveView application
export const SpaceLayoutEditor = {
mounted() {
// I use webpack chunks to reduce LiveView entry file size
import(/* webpackChunkName: "space-layout-editor-lv" */ '../entry/space-layout-editor-lv').then((mounter) => {
this.unmountComponent = mounter.default(this.el.id, {
editorOpts: this.editorOpts()
})
}).catch(console.error)
},