This article will include the capturing of non-digital media from Cassettes, Cassette Inlays, Disks, Disk Sleeves, Manuals, Newsletters, Packaging and anything else that is printed.
Preferred method for Inlay, Tape and Disk Scans
I have just tested NAPS2 and even though saving the scans as TIFF, my scanned images have JPG artifacts indicating they are saved in a lossy format.



Stargazer Manual Scanning notes
These are just for reference at the minute as they are very in complete
I will cover how to debug languages and CMS that I use with VSCode, Edge, Xampp, xDebug and other diagnostic tools as required.
These instructions might not be the most complex but they will explain the basics allowing you to get started without pulling your hair out. I find when you have a soft start you are able to pick the more complex concepts easier, and more crucially, on your own.
While I will concentrate on using Edge as my browser there will be a lot of cross over to Firefox and Google Chrome, especially between Edge and Chrome as they are both based on the Chromium browser.
F3 (or CTRL+ALT+F), a search menu will appear. You can then search or filter for a variable or it's value.\n as a new line where as the View method.settings.json
"debug.inlineValues": true
Debug: Inline Values, VS Code shows the runtime value of variables directly in the editor while debuggingThis might sound obvious, but there is always information in the browsers console.
Examine the console for errors, warnings and notifications.
You can use console.log() to output all sorts of information about variables, functions, classes and results into the console, although you might find using debugger easier for this. A console.log() can be used to output different messages depending on the result of a calculation or function and so on. For instance you would have a console.log() for success and one for failure.
### This will output the value `12345678` stored in the variable (`abc`) to the console
var abc = 12345678
console.log(abc);
### This will output the text `This is a message` to the console
console.log('This is a message');
### This will output `123` to the console
console.log(100 + 23);
### This will output the specified function (debounce) as text to the console. Useful to see if the function is defined
console.log(window.debounce);
Example Output:
ƒ debounce(func, timeout = 300) {
let timer;
return (...args) => {
clearTimeout(timer);
timer = setTimeout(() => { func.apply(this, args); }, timeout);
};
}
This is the traditional method of debugging using your browser and is usually JavaScript debugging as it is the browser (Client Side) that executes the code.
Notes
debugger from your code to pause on that line is equivalent to a line-of-code breakpoint, except that the breakpoint is set in your code, not in the DevTools UI.debugger;
$this variable, hover over it and it will show you all of the relevant variablesUsing this code as our example:
var chartDataDataset = _(timeScaleSegments).map(function(timeScaleRange, timeScaleIndex){ return countsPerTimeScaleIndex[timeScaleIndex] || 0; }).value();
In Edge DevTools, I can use debugger; to stop JavaScript and then examine the variables and objects. When I look at the chartDataDataset, DevTools shows Array(0) but DevTools knows that it has 3 arrays in it.
How do I use DevTools to Get a Live Reference so I can see these arrays in this object/array?
You're encountering a common behaviour in DevTools (including Edge and Chrome) where objects like arrays show as Array(0) at first glance — especially when the data is lazy-loaded or the object is logged in a way that doesn't immediately expand its contents.
So, when you pause in the debugger and hover or inspect an object such as chartDataDataset, DevTools might show:
Array(0)
This often happens when:
Here's several methods on how to see the full data, the live snapshot, which will show the "hidden arrays" in DevTools.
chartDataDataset is defined, add:
console.log(chartDataDataset);
debugger; statement after the line where chartDataDataset is defined:
var chartDataDataset = _(timeScaleSegments)
.map(function(timeScaleRange, timeScaleIndex){
return countsPerTimeScaleIndex[timeScaleIndex] || 0;
})
.value();
debugger;
chartDataDataset in the "Local" variables.It still says Array(0):
chartDataDataset and press Enter.This won't work well if it contains circular references, but it's useful for flat data.
console.log(JSON.stringify(chartDataDataset, null, 2));
While not fully "live", this lets you re-evaluate on demand as you continue stepping.
chartDataDataset to the Watch panel.You can select an object in the Elements or Scope tab and reference it in Console using:
$0 (currently selected object)$1, $2 for previous onesOr, just manually type chartDataDataset into the Console after it’s defined. That always evaluates it in real-time.
ini_set('display_errors', '1');
ini_set('display_startup_errors', '1');
error_reporting(E_ALL);
display_errors = on;
Below are the xDebug configurations I use.
launch.json"launch": {
"configurations": [
{
"name": "Listen for XDebug",
"type": "php",
"request": "launch",
"port": 9003,
"xdebugSettings": {
"max_children": 128,
"max_data": -1,
"max_depth": 3
},
},
{
"name": "Launch currently open script",
"type": "php",
"request": "launch",
"program": "${file}",
"cwd": "${fileDirname}",
"port": 9003,
"runtimeExecutable": "D:\\websites\\php\\php.exe"
}
]
},
I have not used this, it is just for reference because I do not understand the additional options.
{
"name": "Launch Built-in web server",
"type": "php",
"request": "launch",
"port": 9003,
"program": "",
"cwd": "${workspaceRoot}",
"runtimeArgs": [
"-dxdebug.mode=debug",
"-dxdebug.start_with_request=yes",
"-S",
"localhost:0"
],
"env": {
"XDEBUG_MODE": "debug,develop",
"XDEBUG_CONFIG": "client_port=${port}",
"XDEBUG_TRIGGER": "VSCODE"
},
"serverReadyAction": {
"pattern": "Development Server \\(http://localhost:([0-9]+)\\) started",
"uriFormat": "http://localhost:%s",
"action": "openExternally"
}
"pathMappings": {
"/srv/www/mywebsiteroot": "${workspaceRoot}",
"/app/": "${workspaceRoot}"
},
"stopOnEntry": true,
"log": true
}
zend_extension line for Xdebug below the line for OPCache, or in a file starting with a higher number (ie. 99-xdebug.ini vs 20-opcache.ini), otherwise they won't work properly together.[XDebug v3]
; https://xdebug.org/
; https://xdebug.org/docs/all_functions
; https://xdebug.org/docs/all_settings
; https://xdebug.org/docs/upgrade_guide - (V2 -> V3) including replacements
; https://xdebug.org/docs/develop
; https://xdebug.org/docs/errors
;;;; Binary Location
; Download here: https://github.com/xdebug/xdebug/releases
; Xampp uses: 64-bit Thread Safe, for this version of PHP
; Example file explained : php_xdebug-3.5.1-8.2-ts-vs16-x86_64.dll
; 3.5.1 = xDebug Version
; 8.2 = Target PHP version
; ts = Thread Safe / nts = Not Thread Safe
; vs16 = Visual Studio version used to compile the DLL
; x86_64 = Supported Archietecture
; Thread Safe vs Non Thread Safe
; https://stackoverflow.com/questions/5793751/what-are-the-technical-differences-between-the-thread-safe-and-non-thread-safe-p
; If you're running Apache (or IIS) as FastCGI (or CGI) then you want the Non Thread Safe version of PHP.
; If you're running Apache as default (as a Module), then you'll want the more traditional Thread Safe version.
; Direct dll call
zend_extension = "D:\websites\php\ext\php_xdebug-3.5.1-8.2-ts-vs16-x86_64.dll"
; Alias call
; Download php_xdebug-3.5.1-8.2-ts-vs16-x86_64.dll
; Rename it to php_xdebug.dll
; Move the downloaded file to D:\websites\php\ext
; Use this call method below instead of the direct dll call.
;zend_extension = xdebug
;;;; Connection Settings
xdebug.mode = debug,develop
; https://xdebug.org/docs/all_settings#mode
; debug is needed for step debugging
; develop is needed to show orange `Call Stack`
; https://stackoverflow.com/questions/67274848/xdebug-3-not-showing-stack-trace-on-fatal-error-since-upgrading
xdebug.client_host = thebrain
; Can use an IP here but hostname is better
xdebug.client_port = 9003
; default port: 9003
xdebug.idekey = "vsc"
xdebug.file_link_format = "vscode://file/%f:%l"
; Clickable Stack Traces
; xdebug.file_link_format = "netbeans://open/?f=%f:%l"
; IDE Links stack traces and errors - https://xdebug.org/docs/all_settings#file_link_format - Read the Readme
;xdebug.start_with_request = yes
; The functionalit starts when the PHP request starts, and before any PHP code is run.
; I do not use this because i use a browser plugin
; https://buildio.dev/xdebug-and-its-impact-on-performance-xampp/
; It instructs XDebug to start a debugging session at the beginning of every PHP request.
; This means that XDebug will be active for all PHP executions, whether they are accessed through a web browser, CLI, or any other method that invokes PHP.
;xdebug.start_upon_error = yes
;Xdebug will trigger a debugging connection when a PHP Notice or Warning appears, or when a Throwable (Error or Exception) is thrown.
; This will be intiated by the browser, i think you have to have netbeans waiting in debug mode
;;;; Logging
; All warnings and errors also show up in the diagnostics log that you can view by calling xdebug_info().
; All data is appended
;xdebug.log = "D:\websites\tmp\xdebug\xdebug.log"
; https://xdebug.org/docs/all_settings#log_level
xdebug.log_level = 7
;controls how much information is logged.
;;;; Remote
;xdebug.remote_autostart = 0
; This must be off otherwise curl_exec() will crap out the debugger - dont know about V3
; ?? https://xdebug.org/docs/all_settings#start_with_request
;xdebug.remote_mode = req
;;;; General
;xdebug.collect_return = off
;xdebug.max_nesting_level = 100
; For Gantry - https://docs.gantry.org/gantry5/troubleshooting/max-nesting-level use 256
;xdebug.show_exception_trace = 1
; When this setting is set to 1, Xdebug will show a stack trace whenever an Error is raised - even if this Error is actually caught.
;xdebug.show_local_vars = 1
;This shows local variables in the stack trace
;https://xdebug.org/docs/develop
;xdebug.var_display_max_data = 16384
;;NOT in V3 - I Need to find the equivalent
;xdebug.auto_trace = off
;xdebug.collect_includes = on
;xdebug.collect_params = off
;xdebug.default_enable = on
;xdebug.extended_info = 1
;xdebug.manual_url = http://www.php.net
;xdebug.show_mem_delta = 0
;;;; Trace options
;xdebug.trace_options = 0
; When set to '1' the trace files will be appended to, instead of being overwritten in subsequent requests.
;xdebug.trace_format = 0
;xdebug.trace_options = 0
;xdebug.trace_output_name=crc32
; NOT in V3 - I Need to find the equivalent
;xdebug.trace_output_dir= "d:\websites\tmp\xdebug\trace"
;;;; Profiling - https://xdebug.org/docs/profiler
;xdebug.xdebug.profiler_append = 0
;xdebug.profiler_output_name = cachegrind.out.%p
; or "cachegrind.out.%t-%s"
; NOT in V3 - I Need to find the equivalent
;xdebug.profiler_aggregate = 0
;xdebug.profiler_enable = 0
;xdebug.profiler_enable_trigger = 0
;xdebug.profiler_enable_trigger_value = ""
;xdebug.profiler_output_dir = "D:\websites\tmp\xdebug\profiler"
;;;; Value Dumping
;https://xdebug.org/docs/all_settings#dump.*
;xdebug.dump.SERVER = REMOTE_ADDR,REQUEST_METHOD
;xdebug.dump.GET = *
;xdebug.dump_undefined=1
PHP-FPM has a clear_env configuration setting that is on by default, which you will need to turn off if you want to use XDEBUG_CONFIG.XDEBUG_CONFIG environment variable to be passed on.output_buffering = Off in your php.ini or use ob_end_flush() in your code.error_log setting to syslog and PHP will send all error log messages to stderr, which Xdebug will then send to the IDE.error_log messages to the IDE, but there is now an xdebug_notify() function, with which you can send messages (strings, and variables) to the IDE as well.xdebug_notify() works, thank you! However, setting error_log to syslog in php.ini, restarting Apache, then issuing error_log("test"); in PHP (8.2) does not work for me.php_xdebug.dll 3.2.0.11.“max_children” value and enabling unlimited “max_data,” developers can obtain more comprehensive insights into complex data structures and object hierarchies during debugging sessions. Additionally, the limitation imposed on “max_depth” to a value of 3 prevents excessive recursion depths, striking a balance between thoroughness and performance.
"xdebugSettings": {
"max_children": 128,
"max_data": -1,
"max_depth": 3
}
512.launch.json "max_data": -1 into your xdebugSettings:
"xdebugSettings": {
"max_data": -1
},
xdebugSettings below the port declaration if it does not exist.-1 - it doesn't resolve the issue:
ini_get('xdebug.var_display_max_data')
"4096"
max_data in your launch,json. See the xdebugSettings section in the README.These all assume that Xdebug is setup correctly in php.ini
php -d xdebug.remote_enable=1 -d xdebug.remote_mode=req -d xdebug.remote_port=9000 -d xdebug.remote_host=127.0.0.1 -d xdebug.remote_connect_back=0 path/to/script.php
set XDEBUG_CONFIG=remote_enable=1 remote_mode=req remote_port=9000 remote_host=127.0.0.1 remote_connect_back=0
php -d xdebug.remote_enable=on -d xdebug.remote_autostart=0 -d xdebug.remote_handler=dbgp -d xdebug.remote_mode=req -d xdebug.remote_host="192.168.1.226" -d xdebug.remote_port=9001 -d xdebug.remote_connect_back=0 -d xdebug.remote_log="d:\websites\tmp\xdebug\xdebug_remote.log" -d xdebug.idekey="vsc" cron.php
set XDEBUG_CONFIG="idekey=vsc"
unset XDEBUG_CONFIG
set XDEBUG_CONFIG="idekey=vsc"These sections cover the main functionality of Xdebug.
There are many ways to trigger debugging:
cachegrind.out files generated by xdebug 2.var_dump() function; location, stack, and argument information upon Notices, Warnings and Exceptions; and numerous functions and settings to tweak PHP's behaviour.e6540 as this stops things work if you are on a DHCPe6540.lan and e6540.yourdomain.uk will work if configured but will involve an external DNS lookupTutorials
Notes
classic-doors.vm, you need to use a conditional breakpoint, not just a watch so to confirm, a breakpoint needs to be active which pause the execution.Static properties do not automatically appear in the Scope panel, you must add a Watch Expression to see the static variable such as:
$this::$variable \CMSApplication::$VAR Payment::$payment_details PaymentMethodCreditnote::$creditnote_details
This then shows the values of it underneath just like in the variables part.
Other options (not tried)
$this->paymentMethod = new $Payment; $chicken = new $Payment;
xdebug_info();print MyClass::$myStaticVarOtherClass::$theStaticHere are all practical methods depending on what you want:
$ref = new ReflectionClass(MyClass::class); $statics = $ref->getStaticProperties();
$statics in your debugger (it will appear as a normal array and expand cleanly).var_dump((new ReflectionClass(MyClass::class))->getStaticProperties());
(class_exists('MyClass') ? (new ReflectionClass('MyClass'))->getStaticProperties() : null)
(new ReflectionClass(MyClass::class))->getStaticProperties()
new ReflectionClass(MyClass::class)
Why Reflection works
This is just the same as viewing Static Variables but with the following format:
$this->app->components->payment->PaymentMethod - This shows all of the variables of the object $this->app->components->payment->PaymentMethod->$creditnote_details
I have not verified if this method works or if it is made up by AI
if the watch expression matched and execution paused, then VSCode should already be stopped at the line of code where the condition was met, or just before it, depending on when the expression was evaluated.
To find where in the code this happened, when execution has paused:
where
bt
Ctrl+Shift+Y (or View > Debug Console) to check the output.You simple add this function into your code and when it is called, it instanciates a breakpoint and causes the execution to pause.
xdebug_break() within your code to force a break.You simple create a breakpoint on your code using the GUI of VSCode and execution is paused at this point.
$payment_id == 90 $payment->id == 90 Payment::$payment_details['payment_id'] == 90 Payment::$payment_details['payment_id'] == true Payment::$payment_details['payment_id'] == false isset($payment['id']) && $payment['id'] == 90
$template === 'classic-doors'Or if unsure of the variable name, use:
strpos($template ?? '', 'classic-doors') !== false
true, Xdebug pauses, and VSCode opens the exact file/line where it matched.To get Xdebug in VSCode to pause (break) when any variable equals classic-doors, you can follow one of these approaches depending on your version of Xdebug and PHP:
$variable === 'classic-doors'
or
$pageTemplate === 'classic-garage-doors'
$someVariable === 'classic-doors'
if ($someVariable === 'classic-doors') {
xdebug_break(); // Forces a debug pause if Xdebug is connected
}
This is required for all methods.
xdebug.mode = trace xdebug.mode = develop,debug,trace
xdebug.output_dir="D:\websites\tmp\site.trace" xdebug.output_dir="D:\\websites\\tmp\\site.trace" xdebug.output_dir="D:/websites/tmp/site.trace" xdebug.output_dir="/tmp/site.trace"
D:\websites\tmp\site.trace.xt)\\ or single-quoted forward slashes / both work.xdebug.show_error_trace=1 xdebug.show_exception_trace=1
This method is the easiest and allow you to turn it on and off very quickly, however your will end up tracing the whole application.
Instructions
This method can be useful for tracing particular sections of code.
Instructions
xdebug_start_trace('/tmp/wp-trace');
/tmp/wp-trace.xt
include, require, include_once, etc.0.0001 104856 -> require_once(/var/www/html/wp-load.php) 0.0023 105321 -> require_once(/var/www/html/wp-config.php) 0.0032 106544 -> include_once(/var/www/html/wp-settings.php) 0.0045 107120 -> require_once(/var/www/html/wp-includes/load.php)
xdebug_start_trace(); - This will output a file to the folder defined by `xdebug.output_dir`
or
xdebug_start_trace('<location>'); - You can specify a location for the trace file. Accepts same formats as `xdebug.output_dir`
These inbuilt PHP functions allow you to Log Stack Traces.
var_dump(debug_backtrace());
debug_print_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS);
Getting Xdebug, Xampp and Netbeans to work together in Windows can be a tricky thing and I want to address that here. These instructions will get debugging working all on the same PC and IP.
A symptom of a PC that is not setup correctly is this Netbeans Socket Exception error. You get this error when Netbeans cannot communicate with Xdebug and is usually because you are running them both on the same computer and therefore IP so the traffic routing is getting mixed up. It could also because something else is running on the debug port you have selected.

These settings are what I am using now and work well.
output_buffering = Off
[XDebug] zend_extension="D:\websites\php\ext\php_xdebug.dll" ;zend_extension="D:\websites\php\ext\php_xdebug-2.5.4-5.6-vc11.dll" xdebug.idekey = vsc xdebug.profiler_append = 0 xdebug.profiler_enable = 0 xdebug.profiler_enable_trigger = 0 xdebug.profiler_output_dir = "d:\websites\tmp\xdebug" xdebug.profiler_output_name = "cachegrind.out.%t-%s" xdebug.remote_enable = 1 xdebug.remote_autostart = 0 xdebug.remote_connect_back = 0 xdebug.remote_host = "192.168.1.160" xdebug.remote_port = 9001 xdebug.remote_handler = "dbgp" xdebug.remote_mode = req xdebug.remote_log = "d:\websites\tmp\xdebug\xdebug_remote.log" xdebug.show_local_vars = 9 xdebug.trace_output_dir = "d:\websites\tmp" ;xdebug.show_exception_trace = 1
Minimum working settings
These are the minimum settings I have found to work but are here only for reference.
[XDebug] ;zend_extension="D:\websites\php\ext\php_xdebug.dll" zend_extension="D:\websites\php\ext\php_xdebug-2.5.4-5.6-vc11.dll" xdebug.remote_enable=1 xdebug.remote_handler=dbgp xdebug.remote_mode=req xdebug.remote_host=192.168.1.160 xdebug.remote_port=9001 xdebug.idekey=vsc
(Tools --> Options --> PHP --> Debugging)
You need to send a trigger to Xdebug via your browser to trigger the debugger. You can send the trgger via GET/POST but you need a plugin for this.
Now you have configured your system as above you need to test it before you can rely on it.
If xdebug does not work straight away then trying these things might help.
This code is taken from 21.4.2 How to Set Up XDebug | Oracle
<?php $address = '127.0.0.1'; $port = '9000'; $sock = socket_create(AF_INET, SOCK_STREAM, 0); socket_bind($sock, $address, $port) or die(); socket_listen($sock); $client = socket_accept($sock); echo "Connection established: $client"; socket_close($client); socket_close($sock); ?>
However I found this slightly better version from dbgtest.php · GitHub
<?php // adapted from https://blogs.oracle.com/netbeansphp/entry/howto_check_xdebug_installation $address = $argv[1] ?: '127.0.0.1'; $port = '9000'; $sock = socket_create(AF_INET, SOCK_STREAM, 0); socket_bind($sock, $address, $port) or die(); echo "Listening to $address:$port\n"; socket_listen($sock); $client = socket_accept($sock); echo "Connection established: $client\n"; socket_close($client); socket_close($sock);
Call to undefined function socket_create()
If there is something running on this socket you will get an error as shown below. This shows that some other process is using the port 9000.
Warning: socket_bind(): unable to bind address [10048]: Only one usage of each socket address (protocol/network address/port) is normally permitted. in D:\websites\htdocs\dbgtest.php on line 5
These are a few workarounds I tried and might work for you. These are not designed to be a permanent fix.
Method 1
* I am not sure if you need to do the IP fix aswell for this to work. It is all caused by routing issues on the loopback system of the PC. Or sockets might be needed.
Method 2
Method 3 - (if working and then stops for no reason)
TL;DR I am not a doctor. These are notes for myself that other people might find useful. Your health and body are your problem and if you have any health issues consult your doctor, not me.
I have had some general health issues which are probably due to bad diet and lifestyle. The advise I got from a Urinary Consultant was limited and in one particular case wrong, so I have decided to figure this out myself and write it up here for a reference.
TL;DR
- For a Man
- Reduce Visceral Fat
- Reduced Cortisol Levels
| Time | Food | Fluids | Supplements | Exercise | Notes |
| 00:00 | |||||
| 01:00 | |||||
| 02:00 | |||||
| 03:00 | |||||
| 04:00 | |||||
| 05:00 | |||||
| 06:00 | |||||
| 07:00 | Breakfast Meal |
|
|
NB: Keep heart in fat burn zone |
|
| 08:00 | |||||
| 09:00 | |||||
| 10:00 | |||||
| 11:00 | |||||
| 12:00 | Meal Replacement / Protein Drink |
|
|||
| 13:00 | |||||
| 14:00 | |||||
| 15:00 | |||||
| 16:00 | |||||
| 17:00 | Normal Meal |
|
|||
| 18:00 | |||||
| 19:00 | Stop Eating | Stop Drinking |
|
|
|
| 20:00 | |||||
| 21:00 | |||||
| 22:00 | |||||
| 23.00 |
|
|
Diet Rules
For things that are not obvious in the table above.
These are just some a collection of ideas.
| Day | Time | Exercise | Notes |
| Monday | 11.00 - 12.30 | ||
| Tuesday | |||
| Wednesday | 11.00 - 12.30 | ||
| Thursday | |||
| Friday | 11.00 - 12.30 | ||
| Saturday | Walk | ||
| Sunday | Walk |
Recommend intakes of various stuff.
| Vitamin / Mineral | Nutrient Reference Intake (NRV) | Notes |
| Beta-Carotene |
|
|
| Biotin (Vitamin B7) |
|
|
| Calcium |
|
|
| Chromium |
|
|
| Copper |
|
|
| Folic Acid / Folate (Vitamin B9) |
|
|
| Glycine |
|
|
| Iodine |
|
|
| Iron |
|
|
| Magnesium |
|
|
| Manganese |
|
|
| Molybdenum |
|
|
| Niacin (Vitamin B3) |
|
|
| Omega 3 |
|
|
| Pantothenic Acid (Vitamin B5) |
|
|
| Phosphorus |
|
|
| Potassium |
|
|
| Riboflavin (Vitamin B2) |
|
|
| Selenium |
|
|
| Sodium Chloride (Table Salt) |
|
|
| Taurine |
|
|
|
Thiamin |
|
|
| Vitamin A |
|
|
| Vitamin B6 |
|
|
| Vitamin B12 |
|
|
| Vitamin C |
|
|
| Vitamin D |
|
|
| Vitamin E |
|
|
| Vitamin K1 |
|
|
| Zinc |
|
|
Vitamin Bottle values might be different to the NHS ones because:
These are not needed for a normal life but aid in improving it.
| Nutrient | Recommended Intake (RI) | Potential Benefits for | Notes |
| Ashwagandha (a.k.a Indian Ginseng) |
|
|
|
| Creatine Monohydrate |
|
|
|
| L-Theanine |
|
|
|
| Magnesium Glycinate |
|
|
|
| Melatonin |
|
|
|
| Modafinil |
|
|
|
The different types of food you should eat as part of a healthy diet
| Reference Intake of an average adult. | |
| Typical Values | Reference Intake (RI) |
| Energy | 8,400kJ / 2000kcal |
| Fat | 70g |
| of which saturates | 20g |
| Carbohydrates | 260g |
| of which sugars | 90g |
| Fibre | - |
| Protein | 50g |
| Salt | 6g |
mcg is preferred for medical information in the United States (US), but prescription writing guidance in the United Kingdom advises that "microgram" should not be abbreviated.g (Gram)
mg (Milligram)
μg / mcg (Microgram)
RI = Reference IntakeNRV = Nutrition Reference ValueBad diet and lifestyle can lead to these issues.
This is a temporary holding page for my QWcrm notes.
creditnote::checkRecordCanBeCreated()creditnote::checkRecordCanBeCreated()creditnote::checkRecordCanBeCreated()creditnote::checkRecordCanBeCreated(){if ($creditnote_details.status == 'unused' || $creditnote_details.status == 'partially_used') && $creditnote_details.client_id}{if $creditnote_details.status == 'unused' && $creditnote_details.invoice_id}{if $creditnote_details.status == 'unused' && $creditnote_details.expense_id}Creditnote::checkRecordCanBeCreated()
Payment::getCreditnoteActionTypes()
My Ventoy notes.
ventoy.json file with the following code:
{
"menu_style": "tree"
}
Current Issues
Instructions
Links
wimboot.img to wimboot.iso, use UltraISO to overwrite your boot.sdi and save the wimboot.iso file, then change wimboot.iso to wimboot.img bootmgr in ventoy_wimboot.img with bootmgr in standard windows11.iso and it's ok.ventoy.wimboot.img updated by me as I shared here https://drive.google.com/file/d/1izQc322ZsE5InRSJaZ5CXatUlDUizcWH/view?usp=sharingbootmgr in standard windows11.iso from Microsoft bootmgr must be capitalized as BOOTMGR Ventoy Warning - Partition1 (exfat) is Not ntfs, the VHD(X) file may not boot normally

Windows Boot Manager - Boot from VHD

Windows Boot Manager - winload.exe missing

Rebuilding the Windows Search Index, which includes the Outlook Search, can resolve various issues:
There are several ways and places to view the search index properties and its progress in rebuilding. After you have wiped your index it is useful to see how things are going.


- Instructions from here: How to Enable or Disable Indexer Backoff in Windows | Windows 10 Forums
Disabling the indexer backoff will allow indexing to finish faster while you're active on the computer instead, but it will use more system resources.
gpedit.mscOn (Default is Off)Off and restart the Windows Search service.
- This only applies if you have Microsoft Outlook the client installed on your PC
- Instructions from here: Outlook 2021 indexing not working - Microsoft Q&A
We need to ensure that Outlook is on the Windows Search Index
Outlook items are only indexed when Outlook is open
- I did not write this script
- Source: how to delete all exclude folders in search indexer and revert it to default? - Microsoft Q&A
- You can remove the bits from the script that you don't want to perform (Delete database | Reset Folder exclusions).
The following Powershell script fixes a lot of issue with the Windows search and is what I used.
# Stop Windows Search Service Stop-Service -Name WSearch # Delete the current search index database and configuration Remove-Item -Path "$env:ProgramData\Microsoft\Search\Data\Applications\Windows" -Recurse -Force Remove-Item -Path "$env:ProgramData\Microsoft\Search\Data\Temp" -Recurse -Force # Optional: Reset registry exclusions (set back to defaults) Remove-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\Windows Search\Gather\Windows\SystemIndex\Sites\LocalHost" -Name "DefaultGatherPolicy" -ErrorAction SilentlyContinue Remove-Item -Path "HKLM:\SOFTWARE\Microsoft\Windows Search\Gather\Windows\SystemIndex\Sites\LocalHost\Paths" -Recurse -Force -ErrorAction SilentlyContinue # Start Search Service Start-Service -Name WSearch
Notes
sc config wsearch start= disabled net stop wsearch REG ADD "HKLM\SOFTWARE\Microsoft\Windows Search" /v SetupCompletedSuccessfully /t REG_DWORD /d 0 /f del "%ProgramData%\Microsoft\Search\Data\Applications\Windows\Windows.edb" /a del "%ProgramData%\Microsoft\Search\Data\Applications\Windows\Windows.db" /a sc config wsearch start= delayed-auto net start wsearch :: reg query "HKLM\SOFTWARE\Microsoft\Windows Search\Gathering Manager" :: reg query "HKLM\SOFTWARE\Microsoft\Windows Search" reg query "HKLM\SOFTWARE\Microsoft\Windows Search\Gathering Manager" /v *path reg query "HKLM\SOFTWARE\Microsoft\Windows Search" /v *dir* reg query "HKLM\SYSTEM\CurrentControlSet\Services\WSearch" icacls %ProgramData%\Microsoft\Search\Data\ icacls %ProgramData%\Microsoft\Search\Data\Temp\ icacls %ProgramData%\Microsoft\Search\Data\Applications icacls %ProgramData%\Microsoft\Search\Data\Applications\Windows PAUSE PAUSE
msdt.exe -ep WindowsHelp id SearchDiagnosticmsdt.exe -ep WindowsHelp id SearchDiagnosticHKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows Search\CrawlScopeManager\Windows\SystemIndex\WorkingSetRules\ and HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows Search\Gather\Windows\SystemIndex\Sites\LocalHost\Paths\
A collection of my FFmpeg notes
Getting the right version can be tricky unless you know what file to download and why, but that is easy to explain.
TL;DR
- Download the latest "Full" release build from: Release Builds - CODEX FFMPEG @ gyan.dev
- The binaries have everything they need compiled into them.
- The binaries are self contained.
In general, when you compile a binary, you may prefer to include its dependencies (Static) so that users don't need to search for external dlls aftermath, or try to use the executable with an incompatible version of the dll, but it means that the same dll will have to be present in all executables that need them, so that the whole software will use more room on the HD. Shared versions are likely to save some space, but I presume they are not significantly faster than others. It is useful just to explain the difference between the two compiling types.
.exe (on Windows) or binary contains all libraries compiled inside it.ffmpeg.exe..dll (on Windows) or .so (on Linux) library files.ffmpeg.exe is smaller, but it requires those external files to run.ffmpeg.exe alone to another PC — you also need all the matching DLLs.bin\ → contains ffmpeg.exe, ffplay.exe, ffprobe.exe, and .dll files.lib\ → contains development libraries (.a, .lib) for compiling against FFmpeg.include\ → header files for developers.Full" version.MKA to FLAC files, but keep the MKA container
mkvtoolnix does not transcode..mka file is FLAC audio, you can use ffmpeg to copy the FLAC audio from the .mka file into a FLAC container.
ffmpeg -i SOURCE.mka -codec:a copy DESTINATION.flac
ffmpeg too but there'll be a conversion:
ffmpeg -i SOURCE.mka -codec:a flac DESTINATION.flac
You’ve got an AEA audio file (Sony ATRAC encapsulation, usually .aea), and while VLC can play it, MKVToolNix won’t accept it — which strongly suggests that the container header is damaged or malformed, even if the raw audio stream is intact. Here are some free/open-source tools and workflows you can try to “repair” or rewrap it into something MKVToolNix will accept:
Try first a straight rewrap (no re-encoding):
ffmpeg -i input.aea -c copy output.wav
or
ffmpeg -i input.aea -c copy output.mka
If the header is corrupt, FFmpeg might still balk. In that case, force stream copy with re-indexing:
ffmpeg -err_detect ignore_err -i input.aea -c copy fixed.mka
If that still doesn’t work, do a lossless re-encode to WAV (PCM):
ffmpeg -i input.aea -c:a pcm_s16le output.wav
Once you have a WAV/FLAC/MKA, MKVToolNix should accept it.
sox input.aea output.wav
.aea into Audacity (it uses FFmpeg under the hood), then export as WAV/FLAC.mkvmerge (the CLI tool) can still handle.mkvmerge -o output.mkv --no-video input.aea
My recommendation: Start with FFmpeg (method 1). If -c copy fails, re-encode to WAV/FLAC and then mux that into MKV. Do you want me to give you a one-liner FFmpeg command that will automatically fix/dump to WAV even if the header is bad, so you can drag it straight into MKVToolNix? you want to keep the original audio stream untouched (no re-encoding). That means we need to focus on remuxing/repairing the container only.
This is the safest first step:
ffmpeg -i input.aea -c copy output.mka
-c copy = stream copy (no re-encoding).mka (Matroska Audio) is usually well-accepted by MKVToolNix.If the header is damaged, you can try forcing FFmpeg to ignore errors:
ffmpeg -err_detect ignore_err -i input.aea -c copy fixed.mka
Even if MKVToolNix GUI rejects it, the CLI might succeed:
mkvmerge -o output.mka input.aea
or
mkvmerge -o output.mkv --no-video input.aea
If FFmpeg can demux the stream but not mux it properly, you could dump the raw stream first:
ffmpeg -i input.aea -c copy output.oma
(.oma is another ATRAC container Sony used; Matroska often accepts it better.)
Then try adding output.oma into MKVToolNix. If all copy-only methods fail, the problem may be that the damaged AEA header prevents FFmpeg from identifying the stream type. In that case, we’d need to manually specify the codec during remuxing (still without re-encoding). Do you want me to write you an FFmpeg command that forces the codec identification (e.g., ATRAC3/ATRAC9) so it can copy the stream even if the header is broken? Perfect ? If the AEA header is damaged, FFmpeg may fail to guess the codec, but you can force it to treat the stream as ATRAC and just remux without re-encoding.
Run:
ffmpeg -i input.aea
Stream #0:0: Audio: atrac3 (or atrac3plus / atrac9), 44100 Hz, stereo
Note the codec name (likely atrac3 or atrac3plus).
Once you know the codec, run:
ffmpeg -f aea -i input.aea -c:a copy -map 0 output.mka
-f aea → forces FFmpeg to read as AEA format.-c:a copy → copies the stream without re-encoding.-map 0 → ensures all streams are included.output.mka → Matroska Audio container, friendly for MKVToolNix.
You can force the codec by specifying it:
ffmpeg -f aea -i input.aea -c:a copy -acodec atrac3 fixed.mka
(or -acodec atrac3plus depending on what you saw in step 1). This way, you keep the original audio untouched, just rewrapped into .mka so MKVToolNix can accept it.
Do you want me to also show you how to probe the file with ffprobe to be 100% sure which ATRAC variant you’ve got before running the copy?
what is ffprobe ffprobe is a companion tool to FFmpeg.
ffmpeg converts or remuxes media,ffprobe analyzes media and prints detailed info about streams, codecs, metadata, bitrates, etc.It’s included automatically when you install FFmpeg (same download).
ffprobe input.aea
You’ll see output something like:
Input #0, aea, from 'input.aea': Duration: 00:04:21.00, bitrate: 132 kb/s Stream #0:0: Audio: atrac3, 44100 Hz, stereo, fltp
That tells you:
aea)atrac3 / atrac3plus / atrac9)Since your AEA header may be broken, ffmpeg -i input.aea or ffprobe input.aea will tell us:
.mka Do you want me to give you a ready-to-run command that uses ffprobe to print just the codec name (so you don’t have to scan through a big text output)? what is the difference between ffprobe and ffpmeg -i Great question ? — they look similar, but there are some important differences between ffmpeg -i and ffprobe:
ffmpeg -i input.extffmpeg is mainly a converter/remuxer.-i, it:
Example:
ffmpeg -i input.aea
Output:
Input #0, aea, from 'input.aea': Duration: 00:04:21.00, bitrate: 132 kb/s Stream #0:0: Audio: atrac3, 44100 Hz, stereo, fltp
ffprobe input.extffprobe is dedicated to analysis only.ffmpeg -iExample (human-readable):
ffprobe input.aea
Example (just codec name in JSON):
ffprobe -v error -select_streams a:0 -show_entries stream=codec_name -of default=noprint_wrappers=1:nokey=1 input.aea
Output:
atrac3
In short:
ffmpeg -i → Quick check, human-readable, but “side effect” is that it looks like an error run.ffprobe → Purpose-built for inspecting files, can give clean codec info and more detailed technical metadata.
Convert AEA to FLAC from the wiki that the rest are based on
for f in *.aea; do ffmpeg -i "$f" -vn -hide_banner -c:a flac -sample_fmt s16 -ar 44100 "${f%.aea}.flac"; done
Your Linux command loops through all *.aea files in the current folder and converts them to FLAC using ffmpeg. On Windows (cmd.exe) you can write it like this:
for %%f in (*.aea) do ffmpeg -i "%%f" -vn -hide_banner -c:a flac -sample_fmt s16 -ar 44100 "%%~nf.flac"
Notes:
.bat), keep the double %%f.%f:for %f in (*.aea) do ffmpeg -i "%f" -vn -hide_banner -c:a flac -sample_fmt s16 -ar 44100 "%~nf.flac"
Do you want me to also give you the PowerShell version (nicer syntax, supports Unicode filenames better), or will you run this in cmd.exe? Here’s the PowerShell version of your loop:
Get-ChildItem *.aea | ForEach-Object {
ffmpeg -i $_.FullName -vn -hide_banner -c:a flac -sample_fmt s16 -ar 44100 "$($_.BaseName).flac"
}
Get-ChildItem *.aea → gets all .aea files in the folder.$_ → represents each file object.$.FullName → full path to the file.$.BaseName → filename without extension (so output becomes filename.flac).⚡ Advantage: PowerShell handles spaces and special characters in filenames much more gracefully than cmd.exe.
Do you want me to also make a ready-to-run .ps1 script that you can drop into your folder and double-click/run, or will you paste it directly into the PowerShell terminal?
Here’s a ready-to-run PowerShell script (batch file) you can save as Convert-AEA.ps1 in the same folder as your .aea files:
# Convert-AEA.ps1
# Converts all .aea files in the current folder to FLAC (16-bit, 44.1kHz)
# Get all .aea files in this folder
Get-ChildItem -Filter *.aea | ForEach-Object {
$inputFile = $_.FullName
$outputFile = "$($_.BaseName).flac"
Write-Host "Converting $($_.Name) -> $outputFile"
ffmpeg -i "$inputFile" -vn -hide_banner -c:a flac -sample_fmt s16 -ar 44100 "$outputFile"
}
Convert-AEA.ps1 in your folder with the .aea files..ps1, not .txt.)Set-ExecutionPolicy -Scope CurrentUser -ExecutionPolicy RemoteSigned
.\Convert-AEA.ps1
Same loop as the first script, just expanded with variables and messages so it’s easier to read and debug.
Got it ✅ Here’s the PowerShell script version (Batch file) that will scan the current folder and all subfolders for .aea files, then convert them to .flac while keeping the same folder structure:
# Convert-AEA.ps1
# Recursively converts all .aea files in this folder (and subfolders) to FLAC (16-bit, 44.1kHz)
# Get all .aea files in this folder and subfolders
Get-ChildItem -Filter *.aea -Recurse | ForEach-Object {
$inputFile = $_.FullName
$outputFile = Join-Path $_.DirectoryName "$($_.BaseName).flac"
Write-Host "Converting $($_.FullName) -> $outputFile"
ffmpeg -i "$inputFile" -vn -hide_banner -c:a flac -sample_fmt s16 -ar 44100 "$outputFile"
}
-Recurse makes PowerShell go into all subfolders.Join-Path $_.DirectoryName ... ensures each .flac lands in the same folder as the original .aea file.music\track1.aea → music\track1.flac music\subfolder\track2.aea → music\subfolder\track2.flac
recursive one-liner (for pasting, and from above)
Get-ChildItem -Filter *.aea -Recurse | ForEach-Object {
ffmpeg -i $_.FullName -vn -hide_banner -c:a flac -sample_fmt s16 -ar 44100 "$($_.DirectoryName)\$($_.BaseName).flac"
}
Difference from your original:
-Recurse → searches subfolders too."$($_.DirectoryName)\$($_.BaseName).flac" → makes sure the .flac is written into the same folder as the source file (not all dumped into the top folder).recursive PowerShell one-liner that also skips files already converted:
Get-ChildItem -Filter *.aea -Recurse | ForEach-Object {
$outFile = Join-Path $_.DirectoryName "$($_.BaseName).flac"
if (-Not (Test-Path $outFile)) {
ffmpeg -i $_.FullName -vn -hide_banner -c:a flac -sample_fmt s16 -ar 44100 $outFile
} else {
Write-Host "Skipping $($_.FullName) → already exists."
}
}
How it works:
Test-Path $outFile → checks if the .flac already exists.ffmpeg normally.
http://www.msftconnecttest.com/connecttest.txt
TL;DR
- Best solution if you want zero hassle: Disable NCSI probing (Method 5)
- The most reliable cross-platform trick is to assign a static IP configuration (with no gateway/DNS), so the OS doesn’t expect Internet routing from that Wi-Fi. That way it just treats it as a LAN.
netsh wlan set profileparameter name="YourSSID" connectionmode=auto netsh wlan set profileparameter name="YourSSID" nonBroadcast=connect(Replace
YourSSID with the exact Wi-Fi name.)By default, Windows disconnects when a network has no valid gateway/internet. You can override that:
ncpa.cpl, hit Enter.Optional: If you don’t need internet routing via this SSID (just local LAN), you can remove the Default Gateway entry in the IPv4 settings. That way, Windows won’t even expect internet, so it won’t try to drop it.
Some Wi-Fi drivers (Intel, Realtek, Killer, etc.) have a feature that disconnects from networks without internet:
There isn’t a simple toggle in Windows to say “stay connected no matter what”, but there are a few reliable workarounds:
This disables the Windows’ NCSI Internet connectivity check forcing Windows to always report “Connected” to your Wi-Fi, even if there’s no Internet so it will never get tagged as "Limited" and then be dropped. Windows will stop testing for internet access and this alone fixes the auto-disconnect in most cases.
regedit, press Enter.HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\NlaSvc\Parameters\Internet
EnableActiveProbing → set to 0 (DWORD)Disable_NCSI.reg
Windows Registry Editor Version 5.00 [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\NlaSvc\Parameters\Internet] "EnableActiveProbing"=dword:00000000
This makes Windows always report “Connected” regardless of Internet access.
Re-Enable_NCSI.reg
Windows Registry Editor Version 5.00 [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\NlaSvc\Parameters\Internet] "EnableActiveProbing"=dword:00000001
Note: With NCSI disabled, Windows will always show “Connected” even if the network is offline. Apps that rely on NCSI (like the captive portal pop-up for hotel Wi-Fi) won’t launch automatically — you’ll need to open a browser manually in those cases.
If you want more control, a few small utilities exist that can “lock” Windows to a specific SSID:
These basically override Windows’ automatic “choose a better network” logic.
This method requires manual intervention but can be useful in some setups.
If you’re comfortable with PowerShell, you can make Windows automatically reconnect to your SSID even if it drops:
# Force Wi-Fi to stay connected to one SSID, even if disconnected
$SSID = "YourSSID"
while ($true) {
$connected = (netsh wlan show interfaces) -match $SSID
if (-not $connected) {
netsh wlan connect name=$SSID
}
Start-Sleep -Seconds 10
}
YourSSID with your exact Wi-Fi name (SSID).ForceWiFi.ps1taskschd.msc).Force Wi-Fi Stay Connectedpowershell.exe-ExecutionPolicy Bypass -File "C:\Path\To\ForceWiFi.ps1"
# Force Wi-Fi to stay connected to one SSID, even if disconnected
$SSID = "YourSSID" # <-- Replace with your Wi-Fi name
while ($true) {
$connected = (netsh wlan show interfaces) -match $SSID
if (-not $connected) {
Write-Output "[$(Get-Date -Format 'HH:mm:ss')] Not connected. Reconnecting to $SSID..."
netsh wlan connect name="$SSID"
} else {
Write-Output "[$(Get-Date -Format 'HH:mm:ss')] Still connected to $SSID."
}
Start-Sleep -Seconds 10
}
YourSSID with your exact Wi-Fi name (SSID).I have added this here just in-case I need to come up with a more streamlined solution.
This script will
C:\ForceWiFi\ForceWiFi.ps1.How to Use
ForceWiFiSetup.bat (Save as type: All Files, not .txt).C:\ForceWiFi\ForceWiFi.ps1 and change YourSSID to your actual Wi-Fi name.After reboot:
Save this as ForceWiFiSetup.bat (Right-click → Run as Administrator):
@echo off
:: =====================================
:: Force Windows to stay connected to one SSID
:: =====================================
:: --- Create folder for script
mkdir "C:\ForceWiFi" >nul 2>&1
:: --- Create the PowerShell script
echo # Force Wi-Fi to stay connected to one SSID, even if disconnected > C:\ForceWiFi\ForceWiFi.ps1
echo $SSID = "YourSSID" # <-- Replace with your Wi-Fi name >> C:\ForceWiFi\ForceWiFi.ps1
echo while ($true) { >> C:\ForceWiFi\ForceWiFi.ps1
echo $connected = (netsh wlan show interfaces) -match $SSID >> C:\ForceWiFi\ForceWiFi.ps1
echo if (-not $connected) { >> C:\ForceWiFi\ForceWiFi.ps1
echo Write-Output "[$(Get-Date -Format 'HH:mm:ss')] Not connected. Reconnecting to $SSID..." >> C:\ForceWiFi\ForceWiFi.ps1
echo netsh wlan connect name="$SSID" >> C:\ForceWiFi\ForceWiFi.ps1
echo } else { >> C:\ForceWiFi\ForceWiFi.ps1
echo Write-Output "[$(Get-Date -Format 'HH:mm:ss')] Still connected to $SSID." >> C:\ForceWiFi\ForceWiFi.ps1
echo } >> C:\ForceWiFi\ForceWiFi.ps1
echo Start-Sleep -Seconds 10 >> C:\ForceWiFi\ForceWiFi.ps1
echo } >> C:\ForceWiFi\ForceWiFi.ps1
:: --- Disable NCSI Active Probing in registry
reg add "HKLM\SYSTEM\CurrentControlSet\Services\NlaSvc\Parameters\Internet" /v EnableActiveProbing /t REG_DWORD /d 0 /f
:: --- Register scheduled task
schtasks /create /tn "ForceWiFiStayConnected" /tr "powershell.exe -ExecutionPolicy Bypass -File C:\ForceWiFi\ForceWiFi.ps1" /sc onlogon /rl highest /f
echo.
echo =====================================
echo Setup complete!
echo - Replace YourSSID in C:\ForceWiFi\ForceWiFi.ps1 with your Wi-Fi name
echo - Restart your computer for registry change to take effect
echo =====================================
pause
Save this as ForceWiFiRemove.bat (Right-click → Run as Administrator):
@echo off
:: =====================================
:: Remove ForceWiFi setup (script + registry + scheduled task)
:: =====================================
:: --- Delete the PowerShell script folder
if exist "C:\ForceWiFi" (
rmdir /s /q "C:\ForceWiFi"
echo Removed C:\ForceWiFi folder.
) else (
echo No C:\ForceWiFi folder found.
)
:: --- Re-enable NCSI Active Probing
reg add "HKLM\SYSTEM\CurrentControlSet\Services\NlaSvc\Parameters\Internet" /v EnableActiveProbing /t REG_DWORD /d 1 /f
echo Re-enabled Windows Internet connectivity check (NCSI).
:: --- Delete scheduled task
schtasks /delete /tn "ForceWiFiStayConnected" /f
echo Removed scheduled task ForceWiFiStayConnected.
echo.
echo =====================================
echo Cleanup complete!
echo - NCSI probing restored
echo - Scheduled task removed
echo - Script folder deleted
echo =====================================
pause
To check how many PCIe lanes your NVMe drive is using in Windows use the following apps to get the information.
How to use:
Transfer Mode: PCIe 3.0 x4 | PCIe 3.0 x4
How to use:
The drive information in this tool is just information read from the tool, it does not have current lane, just information read from the firmware.
How to use:
Interface: PCIe Gen 4.0 x4
This will cover a lot of topics to do with ISO and burning.
.vhd/.vhdx images just like it can open .iso images."Bootable_NoEmulation.img".Bootable_NoEmulation.img to BOOTSECT.BIN"C:\WINPE"BOOTSECT.BIN in the folder "C:\WINPE\I386".7z e isofile.iso '[BOOT]'
.BIF from an existing Bootable ISO and use that..iso that I could use with Ventoy directly.boot.wim file to the Ventoy USB disk and boot to the boot.wim directly from Ventoy - no need to make an ISO. You will need to add Wimboot Plugin too.oscdimg.exe -m -o -u2 -udfver102 -bootdata:2#p0,e,bd:\iso_files\boot\etfsboot.com#pEF,e,bd:\iso_files\efi\microsoft\boot\efisys.bin d:\iso_files d:\14986PROx64.iso becomes oscdimg.exe -m -o -u2 -udfver102 -bootdata:2#p0,e,bE:\boot\etfsboot.com#pEF,e,bE:\efi\microsoft\boot\efisys.bin E:\ C:\users\myname\myiso.iso You can create a one line batch file to do above.
sudo mkisofs -o /path/to/image. iso /dev/sdb
Boot.wim from the folder DiskGenius - Boot (and optionally rename the file to something like, e.g., DiskGenius 5.5.1.1508 x64.wim to make it easier for you to see what exactly this one is) to the root of the VENTOY partition that's on your USB flash drive. Aside from this, you also need to make sure that you have installed the Wimboot plugin for Ventoy before you boot from the USB flash drive. (For this, you need to create a new folder named ventoy in the root of the VENTOY partition, and then copy the file ventoy_wimboot.img into this folder like has been explained here.)