Skip to content

Instantly share code, notes, and snippets.

View cblavier's full-sized avatar

Christian Blavier cblavier

View GitHub Profile
@cblavier
cblavier / semaphore.yml
Created October 7, 2019 16:54
SemaphoreCI pipeline
version: v1.0
agent:
machine:
type: e1-standard-2
os_image: ubuntu1804
fail_fast:
stop:
when: "true"
@cblavier
cblavier / ntest.ex
Created October 7, 2019 16:17
Parallel test runner
defmodule Mix.Tasks.NTest do
use Mix.Task
@wildcard "apps/*/test/**/*_test.exs"
def run([i, n | args]) do
{i, _} = Integer.parse(i)
{n, _} = Integer.parse(n)
test_paths =
@cblavier
cblavier / wait_helper.ex
Created October 7, 2019 15:26
Wait helpers, used with Elixir hound browser testing library
defmodule MyApp.WaitHelper do
use Hound.Helpers
def wait_until(fun), do: wait_until(1000, fun)
def wait_until(0, fun), do: fun.()
def wait_until(timeout, fun) do
fun.()
rescue
Hound.NoSuchElementError -> retry(timeout, fun)
mix xref graph --sink lib/my_app_web/controllers/campaign_controller.ex
lib/my_app_web/views/admin/admin_campaign_log_view.ex
├── lib/my_app_web/router.ex (compile)
│ ├── lib/my_app_web/controllers/admin/admin_tag_controller.ex
│ │ ├── lib/my_app_web/router.ex (compile)
│ │ ├── lib/my_app_web/plugs/authorization.ex (compile)
│ │ │ └── lib/my_app_web/router.ex (compile)
│ │ ├── lib/my_app_web/controllers/helpers/error_helpers.ex (compile)
│ │ │ ├── lib/my_app_web/views/error_view.ex
@cblavier
cblavier / firmware_reload.ex
Last active October 14, 2021 08:44
Elixir nerves to upload firmware / reload code
defmodule Mix.Tasks.PhenixPlayer.Firmware.Reload do
use Mix.Task
alias IEx.Helpers
alias PhenixPlayer.MixProject
@app_name Mix.Project.config()[:app]
def run(_) do
node = :"#{@app_name}@#{System.get_env("MDNS_DOMAIN")}.local"
@cblavier
cblavier / application.ex
Last active April 30, 2023 08:33
Cowboy 2.5 proxy, used to bind a single port (on Heroku) for umbrella Phoenix applications. It supports HTTPS and websockets properly.
defmodule MasterProxy.Application do
alias MyApp.Endpoint, as: MyAppEndpoint
alias MyApp.UserSocket, as: MyAppUserSocket
alias MyOtherApp.Endpoint, as: MyOtherAppEndpoint
alias MyOtherApp.UserSocket, as: MyOtherAppUserSocket
alias Phoenix.LiveReloader.Socket, as: LiveReloadSocket
alias Plug.Cowboy
@cblavier
cblavier / facade.ex
Last active November 2, 2019 11:38
defmodule MyApp.Facade do
defmacro facade(mod) do
quote bind_quoted: [mod: mod] do
Enum.each apply(mod, :__info__, [:functions]), fn {fun, arity} ->
case arity do
0 -> defdelegate unquote(fun)(), to: mod
_ ->
values = Enum.map(1..arity, &(Macro.var(:"arg#{&1}", mod)))
defdelegate unquote(fun)(unquote_splicing(values)), to: mod
defmodule StringUtil do
def raw_binary_to_string(raw) do
raw
|> String.codepoints()
|> Enum.reduce(fn(w, result) ->
if String.valid?(w) do
result <> w
else
<< parsed :: 8>> = w
#!/bin/ash
PATH=/bin:/usr/bin
site=www.google.fr
logfile=/var/log/monitor-internet.log
interval=60
ping_delay=5
reboot_delay=600
livebox_ip=192.168.1.1
livebox_password=password
#!/bin/sh
mkdir -p h264
for i in *.mkv ; do
ffmpeg -i "$i" -bsf:v h264_mp4toannexb -map 0:v -map 0:1 -map 0:a:1 -map 0:s:1 -vcodec libx264 -acodec copy -scodec copy "h264/$i"
done