Skip to content

Instantly share code, notes, and snippets.

View adrienjoly's full-sized avatar
☺️
In the flow

Adrien Joly adrienjoly

☺️
In the flow
View GitHub Profile
@adrienjoly
adrienjoly / git-commit-stats-csv-without-deps-and-releases.sh
Last active June 16, 2023 12:32
Display `git diff` stats, one line per commit
git log --pretty=format:"@%ad ~~%s~~" --date=short --shortstat \
| tr "\n" " " \
| tr "@" "\n" \
| grep -v 'skip ci' \
| grep -v 'deps' \
| grep -v 'dependencies' \
| sed -En 's/ ~~.*~~ /,/p'
@adrienjoly
adrienjoly / template-audit-capacités-devops-dora.md
Last active May 29, 2023 15:12
Template que j'utilise pour auditer mes client sur les "capacités DevOps" proposées par le DORA, et leur donner des recommandations pour progresser. C'est en markdown => importable facilement dans Notion.

Audit Capacités DevOps/DORA

Le livre "Accelerate: The Science of Lean Software and DevOps: Building and Scaling High Performing Technology Organizations" (Gene Kim, Jez Humble, and Nicole Forsgren, 2018) s'appuie sur 5 ans d'études scientifiques pour faire ressortir les pratiques effectivement mises en oeuvre par les sociétés "tech" les plus performantes. (selon la classification de Westrum)

L'équipe de DORA (DevOps Research and Assessment) a identifié et validé un ensemble de capacités permettant d'optimiser les performances organisationnelles et celles de la livraison de logiciels. Ces articles décrivent comment mettre en œuvre, améliorer et mesurer ces capacités.

Source: https://cloud.google.com/architecture/devops/capabilities

Les capacités recommandées sont au nombre de 27, classés en 3 catégories.

Juste un mot pour dire que – après quelques heures d’essais et bidouillages multiples – shadow marche très bien sur Chromecast avec Google TV ! 👌

Je viens de finir Mass Effect 2, branché sur un écran sans audio + sur un hub USB lui même connecté à la fibre via Ethernet, une manette Stadia et une carte son externe branchée sur mes enceintes.

Les trucs à savoir:

  • l’alimentation USB fournie avec le chromecast ne suffit pas à alimenter tout ça => il en faut un plus puissant
  • au premier démarrage, il faut qu’il n’y ait rien d’autre de branché sur le hub, sinon les périphériques seront ignorés => il faut les brancher une fois que le chromecast a fini de démarrer
  • Windows est galère à utiliser sans clavier, mais ça reste possible: utiliser la télécommande du chromecast pour (via le menu de l’app shadow) afficher/cacher le bureau, puis activer le clavier pour presser la première lettre de l’icône du bureau à lancer, puis la touche entrée pour confirmer, enfin fermer le clavier.

Fonctionnalités qui me manquent

@adrienjoly
adrienjoly / find-function-calls.ts
Created April 28, 2022 10:05
Generate the tree of callers of a TypeScript function.
// This script generates the call tree (a.k.a. call hierarchy, or dependency graph) of a function.
//
// Usage: $ npx node-ts find-function-calls.ts <target-file.ts> <target-function-name>
import util from "util"
import assert from "assert"
import * as ts from "typescript"
import * as tsmorph from "ts-morph"
import type { ReferenceEntry, Node, ReferencedSymbol } from "ts-morph"
import type { StandardizedFilePath } from "@ts-morph/common"
@adrienjoly
adrienjoly / format-json-with-nodejs-one-liner.sh
Created June 18, 2020 14:40
A one-line node.js program to format JSON from a stdin stream, to include in bash scripts
$ echo '{"a":1}' \
| node -e \
"d=[];process.openStdin().on('data',c=>d.push(c)).on('end',()=>console.log(JSON.stringify(JSON.parse(d.join('')),null,2)));"
# =>
# {
# "a": 1
# }
@adrienjoly
adrienjoly / jest-test-each.spec.js
Created March 23, 2023 08:56
ways to use Jest's test.each
describe("ways to use Jest's test.each", () => {
test.each([
[1, 1, 2],
[1, 2, 3],
[2, 1, 3],
])('.add(%i, %i)', (a, b, expected) => {
expect(a + b).toBe(expected)
})
@adrienjoly
adrienjoly / cypress.config.ts
Created March 11, 2023 11:02
Logging from Cypress E2E tests, for better troubleshooting
import { defineConfig } from 'cypress'
const cypressConfig = defineConfig({
video: true,
chromeWebSecurity: false,
e2e: {
baseUrl: 'http://localhost:3000',
supportFile: 'cypress/support/e2e/index.js',
setupNodeEvents(on, config) {
require('cypress-terminal-report/src/installLogsPrinter')(on, {
@adrienjoly
adrienjoly / pull_request_template.md
Last active February 6, 2023 17:55
to store in your GitHub repository, in: `.github/PULL_REQUEST_TEMPLATE/pull_request_template.md`

Fixes / contributes to Issue #XXXX.

🎯 Problem / Objective

TODO

💡 Proposed solution

TODO

@adrienjoly
adrienjoly / escape_single_quotes_from_first_line.sh
Last active January 25, 2023 17:57
This script extracts the first line from stdin, then escapes single quotes, so it can be safely passed as an argument.
# This script extracts the first line from stdin,
# then escapes single quotes, so it can be safely passed as an argument.
# get first line from stdin
FIRST_LINE=$(cat - | head -1)
# escape single quotes
echo "${FIRST_LINE}" | sed -e "s/'/'\\\\''/g"
@adrienjoly
adrienjoly / Dockerfile
Last active October 23, 2022 12:34
`Dockerfile` to containerize a server from a Node.js/TypeScript monorepo, using Yarn 3 and Turborepo 1.4. Layers are optimized to reduce rebuild time, using the host's `.yarn` cache.
# Build from project root, with:
# $ docker build -t myorg-api-server .
# pruner stage: Only keep the source code that needs to be built
FROM node:16.16-alpine AS pruner
WORKDIR /app
COPY packages/ packages/
COPY .yarnrc.yml package.json turbo.json yarn.lock .
RUN npx turbo@1.4.0 prune --scope='@myorg/api-server' --docker