Skip to content

Instantly share code, notes, and snippets.

View ldenoue's full-sized avatar
🏔️

Laurent Denoue ldenoue

🏔️
View GitHub Profile
enter recovery mode on your Mac: restart and hold Cmd R
open Utilities -> Terminal
in the terminal, type: `csrutil disable`
restart your Mac
open a Terminal window and type: `systemextensionsctl list`
It will show something like:
```
1 extension(s)
--- com.apple.system_extension.cmio
if [ "$#" -eq 2 ]
then
mkdir $2
ffmpeg -y -i $1 -vf scale=16x16 $2/icon-16x16@1x.png
ffmpeg -y -i $1 -vf scale=32x32 $2/icon-16x16@2x.png
ffmpeg -y -i $1 -vf scale=32x32 $2/icon-32x32@1x.png
ffmpeg -y -i $1 -vf scale=64x64 $2/icon-32x32@2x.png
ffmpeg -y -i $1 -vf scale=128x128 $2/icon-128x128@1x.png
@ldenoue
ldenoue / ViewController.swift
Last active October 1, 2022 09:25
CATextLayer that scrolls text up as more text is added, constrained to n visible lines
override func viewDidLoad() {
super.viewDidLoad()
let text = """
It is a long established fact that a reader will be distracted by the readable content of a page when looking at its layout. The point of using Lorem Ipsum is that it has a more-or-less normal distribution of letters, as opposed to using 'Content here, content here', making it look like readable English. Many desktop publishing packages and web page editors now use Lorem Ipsum as their default model text, and a search for 'lorem ipsum' will uncover many web sites still in their infancy. Various versions have evolved over the years, sometimes by accident, sometimes on purpose (injected humour and the like).
"""
let fontSize = 88.0
let font = NSFont.systemFont(ofSize: fontSize)
let layer = makeScrollingTextLayer(text: text, width: 800, visibleLines: 3, font: font, timing: 0.2)
self.view.wantsLayer = true
self.view.layer?.addSublayer(layer)
import Foundation
import CoreMediaIO
let CMIOExtensionPropertyCustomPropertyData_just: CMIOExtensionProperty = CMIOExtensionProperty(rawValue: "4cc_just_glob_0000")
let CMIOExtensionPropertyCustomPropertyData_dust: CMIOExtensionProperty = CMIOExtensionProperty(rawValue: "4cc_dust_glob_0000")
...
class cameraStreamSource: NSObject, CMIOExtensionStreamSource {
{
"hello": "Salut",
"common.copy_url": "Copier l'URL de la salle de chat",
"common.copy_succ_hint": "Copié dans le presse-papiers",
"com.room_card.join_btn": "Joindre",
"index": {
"faq_title": "FAQ",
@ldenoue
ldenoue / showSpinner.m
Last active December 17, 2019 14:27
show and hide a fullscreen overlay UIView with a spinner; works even in Action/Share extensions that don't have [UIApplication sharedApplication]
#define OVERLAY_VIEW_TAG 298739
-(void)showSpinner
{
UIView *back = [[UIView alloc]initWithFrame:CGRectMake(0, 0, UIScreen.mainScreen.bounds.size.width, UIScreen.mainScreen.bounds.size.height)];
back.backgroundColor = [[UIColor blackColor] colorWithAlphaComponent:0.6];
back.tag = OVERLAY_VIEW_TAG;
[self.view addSubview:back];
UIActivityIndicatorView *spinner = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhiteLarge];
spinner.center = back.center;
@ldenoue
ldenoue / sharewkwebview.m
Created November 8, 2019 13:11
Capture and share the full content of a WKWebView as a UIImage
-(void)shareHighlightsAsImage:(NSDictionary *)note
{
NSString *filePath = [[NSBundle mainBundle] pathForResource:@"quotes" ofType:@"html"];
NSString *fileContents = [NSString stringWithContentsOfFile: filePath encoding:NSUTF8StringEncoding error:nil];
fileContents = [fileContents stringByReplacingOccurrencesOfString:@"{{url}}" withString:note[@"url"]];
fileContents = [fileContents stringByReplacingOccurrencesOfString:@"{{title}}" withString:note[@"title"]];
fileContents = [fileContents stringByReplacingOccurrencesOfString:@"{{datetime}}" withString:note[@"datetime"]];
fileContents = [fileContents stringByReplacingOccurrencesOfString:@"{{highlights}}" withString:note[@"highlights"]];
WKWebViewConfiguration *config = [[WKWebViewConfiguration alloc] init];
@ldenoue
ldenoue / make-app-icon-ffmpeg.sh
Last active June 25, 2019 09:00
make app icon for iOS using ffmpeg
if [ "$#" -eq 2 ]
then
mkdir $2
ffmpeg -y -i $1 -vf scale=20x20 $2/icon-20x20@1x.png
ffmpeg -y -i $1 -vf scale=40x40 $2/icon-20x20@2x.png
ffmpeg -y -i $1 -vf scale=60x60 $2/icon-20x20@3x.png
ffmpeg -y -i $1 -vf scale=29x29 $2/icon-29x29@1x.png
ffmpeg -y -i $1 -vf scale=58x58 $2/icon-29x29@2x.png
@ldenoue
ldenoue / gist:15310d7838733b7f26a746c560275d8c
Last active November 26, 2021 20:41
Screenshots and app previews for iOS apps on the App Store
/*
App Screenshots:
3 sizes are required for universal apps (iPhone and iPad)
- 5.5in screens: run simulator with "iPhone 6s+" and take screenshots (1242x2208) video=1080x1920
- 6.5in screens: run simulator with "iPhone XR" and take screenshots (1242x2688) video=886x1920
- 12.9in screens: run simulator with "iPad (2nd or 3d generation" and take screenshots (2048×2732) video=1200x1600
App Preview videos:
1 - Record simulator video: xcrun simctl io booted recordVideo in.mp4
@ldenoue
ldenoue / openURL
Created May 9, 2016 13:30
openURL from Action Extension in iOS without using [UIApplication sharedApplication]
UIResponder *responder = self;
while(responder){
if ([responder respondsToSelector: @selector(OpenURL:)]){
[responder performSelector: @selector(OpenURL:) withObject: [NSURL URLWithString:url]];
}
responder = [responder nextResponder];
}