diff options
author | Andreas Fankhauser hiddenalpha.ch | 2024-02-19 22:49:36 +0100 |
---|---|---|
committer | Andreas Fankhauser hiddenalpha.ch | 2024-02-19 22:49:49 +0100 |
commit | 6ef494a9ef013799377d3b96205902fcd6f29078 (patch) | |
tree | 1f62efd2d04c303f4605b6c1a9d6667b0a4e1191 | |
parent | d2cf81052a817a9b9a61e2a97374034375a81ba6 (diff) | |
parent | d9cc1a9fd67ecf8cdf6e7a75cdd4587ec4fd2d91 (diff) | |
download | UnspecifiedGarbage-6ef494a9ef013799377d3b96205902fcd6f29078.zip UnspecifiedGarbage-6ef494a9ef013799377d3b96205902fcd6f29078.tar.gz |
Merge remote-tracking branch 'master'
-rw-r--r-- | doc/note/links/links.txt | 7 | ||||
-rw-r--r-- | doc/note/maven/maven.txt | 9 | ||||
-rw-r--r-- | doc/note/nginx/nginx.txt | 28 | ||||
-rw-r--r-- | doc/note/qemu/qemu-compile-itself.txt | 21 | ||||
-rw-r--r-- | doc/note/qemu/qemu.txt | 9 | ||||
-rw-r--r-- | doc/note/qemu/setup-dockerVM.txt | 73 | ||||
-rw-r--r-- | doc/note/qemu/setup-windoof.txt | 2 | ||||
-rw-r--r-- | src/main/firefox/gaga-plugin/main.js | 149 |
8 files changed, 203 insertions, 95 deletions
diff --git a/doc/note/links/links.txt b/doc/note/links/links.txt index d187788..10bd745 100644 --- a/doc/note/links/links.txt +++ b/doc/note/links/links.txt @@ -264,13 +264,14 @@ Links (Aka argument amplifiers) - [Just one message per minute](https://gitit.post.ch/projects/ISA/repos/eagle/pull-requests/375/overview?commentId=330543) - [Houston down readyness probe timeout](https://wikit.post.ch/x/koO0Vg) -## Errorhandling is not needed ... -- [OOM exit code 137 9 sigkill houston openshift pod](https://jira.post.ch/browse/SDCISA-13746?focusedId=1925526&page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#comment-1925526) - ## Common Performance +- [Java Exceptions performance is bad](https://www.baeldung.com/java-exceptions-performance) - [going fast is about doing less](https://m.youtube.com/watch?v=5rb0vvJ7NCY) - [CppCon Tuning Benchmarks clang CPUs Compilers" ](https://m.youtube.com/watch?v=nXaxk27zwlk) +## Errorhandling is not needed ... +- [OOM exit code 137 9 sigkill houston openshift pod](https://jira.post.ch/browse/SDCISA-13746?focusedId=1925526&page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#comment-1925526) + ## Bugs are not an issue - [Bistr gateleen Forwarder exception](https://jira.post.ch/browse/SDCISA-11147) diff --git a/doc/note/maven/maven.txt b/doc/note/maven/maven.txt index 309fa63..10a606a 100644 --- a/doc/note/maven/maven.txt +++ b/doc/note/maven/maven.txt @@ -23,10 +23,15 @@ mvn deploy -DaltDeploymentRepository=artifactory-snapshots::default::https://art mvn deploy -Dcmake.generate.skip=true -Dcmake.compile.skip=true -DaltDeploymentRepository=artifactory-releases::default::https://artifactory.tools.pnet.ch/artifactory/libs-release-local -true `# Deploy custom build 20240206` \ +true \ && DEPLOPTS= \ + && `# Deploy custom gateleen build 20240206` \ && mvn clean install -pl '!gateleen-hook-js,!gateleen-playground' \ - && mvn deploy -DskipTests -pl '!gateleen-hook-js,!gateleen-playground' $DEPLOPTS \ + && mvn deploy -DskipTests -pl '!gateleen-hook-js,!gateleen-playground' ${DEPLOPTS:?} \ + && `# Deploy custom houston build 20240216` \ + && jenkinsbuild-by-upstream \ + #&& mvn clean install \ + #&& mvn deploy -DskipTests ${DEPLOPTS:?} \ && true diff --git a/doc/note/nginx/nginx.txt b/doc/note/nginx/nginx.txt index d5ce9db..0550e7f 100644 --- a/doc/note/nginx/nginx.txt +++ b/doc/note/nginx/nginx.txt @@ -3,34 +3,44 @@ [looks promising](https://stackoverflow.com/a/73297125/4415884) + # Basic setup: + # - Maybe change "access_log" to "/var/log/nginx/access.log". + # - For CLI use: Change all "/tmp/nginx" to "." (single dot, aka workdir or + # other user writable dir). + # Public expose setup: + # - Adapt "listen" as commented. + # - set "server_name" to meaningful value. + # #daemon off; # run in foreground (eg from cli) events {} - pid nginx.pid; + pid /var/run/nginx.pid; http { access_log /dev/stdout; # Directories nginx needs configured to start up. - client_body_temp_path .; - proxy_temp_path .; - fastcgi_temp_path .; - uwsgi_temp_path .; - scgi_temp_path .; + client_body_temp_path /tmp/nginx; + proxy_temp_path /tmp/nginx; + fastcgi_temp_path /tmp/nginx; + uwsgi_temp_path /tmp/nginx; + scgi_temp_path /tmp/nginx; server { - # For public access use "80" and "[::]:80" + # public access: "80" and "[::]:80" + # local access: "127.0.0.1:80" and "[::1]:80" listen 127.0.0.1:80; listen [::1]:80; server_name localhost; - root /srv/www + root /srv/www; location /foo { + #autoindex on; # directory listing try_files $uri $uri/ =404; } location /example { - autoindex on; # enable directory listing return 200 "Example says hi"; } } } + [tutorial](https://www.javatpoint.com/nginx-minimal-configuration) diff --git a/doc/note/qemu/qemu-compile-itself.txt b/doc/note/qemu/qemu-compile-itself.txt new file mode 100644 index 0000000..c274c13 --- /dev/null +++ b/doc/note/qemu/qemu-compile-itself.txt @@ -0,0 +1,21 @@ + +# +# Compile qemu bullshit-free for windoof. +# + +true \ + && QEMU_URL="https://gitlab.com/qemu-project/qemu/-/archive/v8.2.1/qemu-v8.2.1.tar.gz" \ + && WORKDIR=/home/${USER:?}/work \ + && CACHEDIR=/var/tmp \ + && QEMU_TGZ="${QEMU_URL_TODOCUTIT:?}" \ + && apt install -y --no-install-recommends curl \ + && curl -D- "${QEMU_URL:?}" -o "${CACHEDIR:?}/${QEMU_TGZ:?}" \ + && cd "${WORKDIR:?}" \ + && tar xf "${CACHEDIR:?}/${QEMU_TGZ:?}" \ + && mkdir build \ + && cd build \ + && ../configure \ + && make \ + && true + + diff --git a/doc/note/qemu/qemu.txt b/doc/note/qemu/qemu.txt index 1862858..4dd7f0c 100644 --- a/doc/note/qemu/qemu.txt +++ b/doc/note/qemu/qemu.txt @@ -34,7 +34,16 @@ Windoof: qemu-img convert -O qcow2 input.qcow output.qcow2 +## Shrink snapshot layer + + qemu-img convert -O qcow2 snapLayer.qcow2 tmpFullClone.qcow2 + qemu-img create -f qcow2 -b tmpFullClone.qcow2 diff.qcow2 + qemu-img rebase -b base.qcow2 tmpDiff.qcow2 + mv tmpDiff.qcow2 snapLayer.qcow2 + + ## Example Params (Usage: CopyPaste, then delege what is not needed) +# TODO use '-nodefaults'. qemu-system-x86_64 \ -accel kvm:whpx:hax:tcg -m size=2G -smp cores=$(nproc) \ -monitor stdio \ diff --git a/doc/note/qemu/setup-dockerVM.txt b/doc/note/qemu/setup-dockerVM.txt new file mode 100644 index 0000000..b3e7e67 --- /dev/null +++ b/doc/note/qemu/setup-dockerVM.txt @@ -0,0 +1,73 @@ + +# +# Use qemu to host dockerimages. +# +# [Execute Docker Containers as QEMU MicroVMs](https://mergeboard.com/blog/2-qemu-microvm-docker/) +# + +true \ + && LINUX_URL=https://cdn.kernel.org/pub/linux/kernel/v6.x/linux-6.7.4.tar.xz \ + && SUDO=sudo \ + && CACHEDIR=/var/tmp \ + && WORKDIR=/home/$USER/work \ + && LINUX_TXZ=$(basename "${LINUX_URL:?}") \ + && true \ + && $SUDO apt install -y --no-install-recommends make gcc bc flex bison libc-dev libelf-dev libssl-dev \ + && true \ + && cd "${CACHEDIR:?}" \ + && curl -L "${LINUX_URL:?}" -O \ + && cd "${WORKDIR:?}" \ + && tar xf "${CACHEDIR:?}/${LINUX_TXZ:?}" \ + && cd linux* \ + && base64 -d <<EOF | gunzip > .config && +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 +xqZFdHAYI2VciPZ/TosyDcUdAAA= +EOF +true \ + && make olddefconfig \ + && make -j$(nproc) \ + && echo "[WARN ] TODO steps from here on are UNTESTED" && sleep 3 \ + && ls -Ahl arch/*/boot/bzImage \ + && true + + diff --git a/doc/note/qemu/setup-windoof.txt b/doc/note/qemu/setup-windoof.txt index 4428ba3..5df2cac 100644 --- a/doc/note/qemu/setup-windoof.txt +++ b/doc/note/qemu/setup-windoof.txt @@ -32,7 +32,7 @@ trashcan or downloaded installers: SDelete.exe -nobanner -z C: -Shutdown guest, then compact disc. +Shutdown win guest, then compact disc. qemu-img convert -O qcow2 input.qcow output.qcow2 diff --git a/src/main/firefox/gaga-plugin/main.js b/src/main/firefox/gaga-plugin/main.js index 2a5bbae..4447719 100644 --- a/src/main/firefox/gaga-plugin/main.js +++ b/src/main/firefox/gaga-plugin/main.js @@ -1,15 +1,10 @@ /* - * For how to install see: - * - * "https://git.hiddenalpha.ch/UnspecifiedGarbage.git/tree/doc/note/firefox/firefox.txt" + * [How to install](UnspecifiedGarbage/doc/note/firefox/firefox.txt) */ ;(function(){ try{ var NDEBUG = false; var STATUS_INIT = 1; - var STATUS_RUNNING = 2; - var STATUS_DONE = 3; - var STATUS_OBSOLETE = 4; var NOOP = function(){}; var LOGERR = console.error.bind(console); var N = null; @@ -19,11 +14,10 @@ function main(){ var app = Object.seal({ ui: {}, - status: Object.seal({ - checklistBtn: STATUS_INIT, - developmentBtn: STATUS_INIT, - }), lastClickEpochMs: 0, + wantChecklistExpanded: false, + wantDevelopmentExpanaded: false, + wantBigTemplateExpanded: false, }); if( NDEBUG ){ setTimeout = window.setTimeout; @@ -32,14 +26,16 @@ }else{ /* fix broken tooling */ setTimeout = setTimeoutWithCatch.bind(0, app); logErrors = logErrorsImpl.bind(N, app); - LOGDBG = console.debug.bind(console); + LOGDBG = console.debug.bind(console, "[gaga-plugin]"); } document.addEventListener("DOMContentLoaded", logErrors.bind(N, onDOMContentLoaded, app)); + scheduleNextStateCheck(app); + LOGDBG("gaga-plugin initialized"); } function onDOMContentLoaded( app ){ - cleanupClutter(app); + LOGDBG("onDOMContentLoaded()"); attachDomObserver(app); } @@ -50,83 +46,58 @@ } - function onDomHasChangedSomehow( app, changes, mutationObserver ){ - var nowEpochMs = Date.now(); - if( (app.lastClickEpochMs + 2000) > nowEpochMs ){ - LOGDBG("ignore, likely triggered by user."); - return; } - var needsReEval = false; - for( var change of changes ){ - if( change.target.nodeName != "BUTTON" ) continue; - var isAriaExpanded = (change.attributeName == "aria-expanded"); - var isChildAdded = (change.addedNodes.length > 0); - var isChildRemoved = (change.removedNodes.length > 0); - var isChildAddedOrRemoved = isChildAdded || isChildRemoved; - if( !isAriaExpanded && !isChildAddedOrRemoved ) continue; - if( isAriaExpanded ){ - LOGDBG("Suspicious, isExpanded: ", change.target); - needsReEval = true; break; - } - if( !isChildAddedOrRemoved ) continue; - var isBloatyChecklistBtnStillThere = document.body.contains(getBloatyChecklistBtn(app)); - if( !isBloatyChecklistBtnStillThere ){ - LOGDBG("Suspicious, btn lost"); - needsReEval = true; break; - } - var isBloatyDevelopmentBtnStillThere = document.body.contains(getBloatyDevelopmentBtn(app)); - if( !isBloatyDevelopmentBtnStillThere ){ - LOGDBG("Suspicious, btn lost"); - needsReEval = true; break; - } - } - if( needsReEval ){ - LOGDBG("Change detected! Eval again"); - app.ui.bloatyChecklistBtn = null; - app.ui.bloatyDevelopmentBtn = null; - setTimeout(cleanupClutter, 42, app); + function scheduleNextStateCheck( app ){ + //LOGDBG("scheduleNextStateCheck()"); + if( app.stateCheckTimer ){ + LOGDBG("Why is stateCheckTimer not zero?", app.stateCheckTimer); } + app.stateCheckTimer = setTimeout(function(){ + app.stateCheckTimer = null; + scheduleNextStateCheck(app); + performStateCheck(app); + }, 42); } - function cleanupClutter( app ){ - if( app.bloatyChecklistDone != STATUS_RUNNING ){ - app.bloatyChecklistDone = STATUS_OBSOLETE - setTimeout(hideBloatyButton, 0, app, "checklistBtn"); - } - if( app.bloatyDevelopmentDone != STATUS_RUNNING ){ - app.bloatyDevelopmentDone = STATUS_OBSOLETE; - setTimeout(hideBloatyButton, 0, app, "developmentBtn"); - } - if( app.bloatyDevelopmentDone != STATUS_RUNNING ){ - app.bloatyDevelopmentDone = STATUS_OBSOLETE; - setTimeout(hideBloatyButton, 0, app, "bigTemplateBtn"); + function performStateCheck( app ){ + var buttons = [ "checklistBtn", "developmentBtn", "bigTemplateBtn" ]; + var wantKey = [ "wantChecklistExpanded", "wantDevelopmentExpanaded", "wantBigTemplateExpanded" ]; + for( var i = 0 ; i < buttons.length ; ++i ){ + var btnKey = buttons[i]; + var btnElem = getBloatyButton(app, btnKey); + if( !btnElem ) continue; + var isExpanded = isAriaBtnExpanded(app, btnElem) + var wantExpanded = app[wantKey[i]]; + //LOGDBG(btnKey +" expanded is", isExpanded); + if( isExpanded && !wantExpanded ){ + collapseAriaBtn(app, btnElem); + } } } - function setLastClickTimeToNow( app ){ app.lastClickEpochMs = Date.now(); } + function onDomHasChangedSomehow( app, changes, mutationObserver ){ + var nowEpochMs = Date.now(); + LOGDBG("DOM Change detected!"); + /*refresh dom refs so check will work on correct elems*/ + Object.keys(app.ui).forEach(function( key ){ + app.ui[key] = null; + }); + } - function hideBloatyButton( app, btnKey ){ - if( app.status[btnKey] == STATUS_DONE ){ - LOGDBG(btnKey +" now hidden"); - return; } - app.status[btnKey] == STATUS_RUNNING; - var btn = getBloatyButton(app, btnKey); - do{ - if( !btn ){ LOGDBG(btnKey +" not found. DOM maybe not yet ready?"); break; } - var isExpanded = isAriaBtnExpanded(app, btn); - if( isExpanded === true ){ - LOGDBG(btnKey +".click()"); - btn.click(); - }else if( isExpanded === false ){ - app.status[btnKey] = STATUS_DONE; - }else{ - throw Error("Neither true nor false "+ typeof(isExpanded) +" "+ isExpanded); - } - }while(0); - /* try later */ - setTimeout(hideBloatyButton, 16, app, btnKey); + function onBloatyChecklistBtnMousedown( app ){ + app.wantChecklistExpanded = !app.wantChecklistExpanded; + } + + + function onBloatyDevelopmentBtnMousedown( app ){ + app.wantDevelopmentExpanaded = !app.wantDevelopmentExpanaded; + } + + + function onBloatyBigTemplateBtnMousedown( app ){ + app.wantBigTemplateExpanded = !app.wantBigTemplateExpanded; } @@ -135,19 +106,22 @@ }else if( btnKey == "checklistBtn" ){ var selector = "button[aria-label=Checklists]"; var uiKey = "bloatyChecklistBtn"; + var onMousedown = onBloatyChecklistBtnMousedown; }else if( btnKey == "developmentBtn" ){ var selector = "button[aria-label=Development]"; var uiKey = "bloatyDevelopmentBtn"; + var onMousedown = onBloatyDevelopmentBtnMousedown; }else if( btnKey == "bigTemplateBtn" ){ var selector = "button[aria-label=BigTemplate]"; var uiKey = "bloatyBigTemplateBtn"; + var onMousedown = onBloatyBigTemplateBtnMousedown; }else{ throw Error(btnKey); } if( !app.ui[uiKey] ){ var btn = fetchUiRefOrNull(app, document, selector); if( btn ){ - btn.addEventListener("mousedown", logErrors.bind(N, setLastClickTimeToNow, app)); + btn.addEventListener("mousedown", logErrors.bind(N, onMousedown, app)); app.ui[uiKey] = btn; } } @@ -155,6 +129,21 @@ } + function collapseAriaBtn( app, btnElem ){ + do{ + var isExpanded = isAriaBtnExpanded(app, btnElem); + if( isExpanded === true ){ + LOGDBG("click()"); + btnElem.click(); + }else if( isExpanded === false ){ + break; + }else{ + throw Error("Neither true nor false "+ typeof(isExpanded) +" "+ isExpanded); + } + }while(0); + } + + function isAriaBtnExpanded( app, btnElem ){ var value = btnElem.getAttribute("aria-expanded"); if( value === "true" ){ |