The Wiert Corner – irregular stream of stuff

Jeroen W. Pluimers on .NET, C#, Delphi, databases, and personal interests

  • My badges

  • Twitter Updates

  • My Flickr Stream

  • Pages

  • All categories

  • Enter your email address to subscribe to this blog and receive notifications of new posts by email.

    Join 1,839 other subscribers

Archive for the ‘Scripting’ Category

how to count the length of an array defined in bash? – Unix & Linux Stack Exchange

Posted by jpluimers on 2020/06/16

I needed to enumerate all the parameters to a function and access many of them by index in the same function, so thanks to both these:

I got at this:

  declare -a arguments=("$@")
  for index in ${!arguments[@]}; do
    echo $index/${#arguments[@]}:${arguments[$index]}
  done

These are all forms of Array handling or Shell Parameter Expansion with special cases for array variables:

  • ! does indirection, in this case from the array to the index of the array
  • # gets the lengt of the parameter (for arrays: the number of elements)
  • [] acccesse an array variable using an index

Via:

–jeroen

Posted in *nix, *nix-tools, bash, bash, Development, Power User, Scripting, Software Development | Leave a Comment »

One day I will dig in the various ways that bash can do evaluation, for now: there is eval, “ and $() and I’m not sure when to choose which.

Posted by jpluimers on 2020/06/10

A while ago, I had to execute a series of aliases of which the names were stored in an array. A simple for loop with en eval call did the job.

Then I found out there are at least two more ways of evaluation in bash, so here are just a few links giving me a head start if I ever dig this up again:

Note that looping over parameters is different than over an array: [WayBack] Loop through an array of strings in Bash? – Stack Overflow

ou can use it like this:

## declare an array variable
declare -a arr=("element1" "element2" "element3")

## now loop through the above array
for i in "${arr[@]}"
do
   echo "$i"
   # or do whatever with individual element of the array
done

# You can access them using echo "${arr[0]}", "${arr[1]}" also

Also works for multi-line array declaration

declare -a arr=("element1" 
                "element2" "element3"
                "element4"
                )

–jeroen

Posted in *nix, *nix-tools, bash, bash, Development, Power User, Scripting, Software Development | Leave a Comment »

pip install –user and your path

Posted by jpluimers on 2020/06/09

I’ve added this to my ~/.bashrc to stuff installed by pip install --user is accessible from interactive shells:

# set PATH so it includes user's private python "pip --user" bin if it exists
if [ -d "$HOME/.local/bin" ] ; then
    PATH="$PATH:$HOME/.local/bin"
fi

The addition is at the end of the path. It is a choice: it means machine installs take prevalence over user installs. That’s usually what I want. For more considerations (including non-interactive shells), see [WayBack] bash – How to correctly add a path to PATH? – Unix & Linux Stack Exchange.

The --user installs do not affect the full system, nor other users.

Further reading:

–jeroen

Posted in Development, Python, Scripting, Software Development | Leave a Comment »

bash + sed: quadruple backslash for proper escaping within an alias

Posted by jpluimers on 2020/06/09

This is part of a bash alias where I had to use quadruple backslash in order to escape it for sed:

# The sed with quad //// is to prevent 'unterminated substitute in regular expression':
alias x='... | sed "s/=.*/ \\\\/"'

This is needed because bash will escape \\\\ into \\ which sed then escapes to \.

The easiest way to find this is to replace the sed with echo to see the expansion.

References:

–jeroen

Posted in *nix, *nix-tools, bash, bash, Development, Power User, Scripting, sed, Software Development | 2 Comments »

Cursor Movement in bash: either echo escape sequences or use tput

Posted by jpluimers on 2020/06/03

I read [WayBackCursor Movement earlier than [WayBack] Colours and Cursor Movement With tput and [WayBack] The Floating Clock Prompt.

So in one of my scripts I’ve now used an escape sequence, but I might change it to tput in a future version:

## Move one line up, then write finished scripts:
echo -e "\033[1A$finished\r"

I would probably have started with put if I had read [WayBack] bash – Set or change vertical position of the cursor – Stack Overflow first.

–jeroen

Posted in *nix, *nix-tools, bash, bash, Development, Power User, Scripting, Software Development | Leave a Comment »

How do I delete a Bash function? – Stack Overflow

Posted by jpluimers on 2020/06/02

I hardly do this, so I tend to forget that unset -f functionname deletes a function and unset variablename or unset -v variablename deletes a variable.

From:

I have done this:bash $ z() { echo ‘hello world’; }How do I get rid of it?

Source: [WayBackHow do I delete a Bash function? – Stack Overflow

Reference: [WayBack] unset Man Page – Bash – SS64.com

–jeroen

Posted in *nix, *nix-tools, bash, bash, Development, Power User, Scripting, Software Development | Leave a Comment »

GitHub – kzahel/web-server-chrome: An HTTP Web Server for Chrome (chrome.sockets API)

Posted by jpluimers on 2020/06/01

Cool: [WayBack] GitHub – kzahel/web-server-chrome: An HTTP Web Server for Chrome (chrome.sockets API)

This allows you to develop HTTP applications that live in Chrome:

[Archive.is1/Archive.is2Web Server for Chrome – Chrome Web Store: A Web Server for Chrome, serves web pages from a local folder over the network, using HTTP. Runs offline.

Of course you could to python -m SimpleHTTPServer 8888 or python -m http.server 8888, but this runs within chrome and can be used from inside JavaScript projects.

Features

  • serve local files
  • configure listening port
  • configure listening interface (e.g. localhost or all interfaces)
  • custom http handlers possible
  • websocket support available
  • works nice with chrome.runtime.onSuspend
  • options for autostart, start in background, etc etc.
  • handles range requests, HEAD, etc
  • options for CORS
  • optional PUT, DELETE request (for upload files)
  • sets MIME types
  • can render directory listing
  • See relevant options: https://github.com/kzahel/web-server-chrome/blob/master/polymer-ui/options.js

Via [WayBack] This is super useful: A# web #server that runs in #Chrome! Makes it super easy to do local web dev without the hassle of setting up a complex back end s… – Jason Mayes – Google+

–jeroen

Posted in Chrome, Development, Google, JavaScript/ECMAScript, Power User, Scripting, Software Development, Web Development | Leave a Comment »

Beyond console.log() – Matt Burgess – Medium

Posted by jpluimers on 2020/05/26

Not yet structured logging, but it brings more structure to your console.log() output:

There is more to debugging JavaScript than console.log to output values. It might seem obvious I’m going to pimp the debugger, but…

[WayBack]: Beyond console.log() – Matt Burgess – Medium

Via: [WayBack] Really useful article for #JavaScript developers: Going beyond #console.log for #debugging and #logging. Some gold i nthis article that may just save yo… – Jason Mayes – Google+

–jeroen

Posted in Development, JavaScript/ECMAScript, Scripting, Software Development, Web Development | Leave a Comment »

When NTFS shrink fails, despite using the default settings from the shrink dialog

Posted by jpluimers on 2020/05/25

Sometimes an NTFS shrink still fails, even though you use the built in Windows defragmentation tools, of SysInternals contig tool.

The best you can do is to follow the steps in:

  1. run diskmgmt.msc to try shrinking the disk, then often it is already in the error message: “You can’t shrink a volume beyond the point where any unremoveable files are located see the defrag event in application log for detailed information about the operation when it has completed.”
  2. use eventvwr.exe and look at the Windows Logs for the most recent Application entries that has Source set to defrag

Those defrag entries usually tell about the last file that could not be moved.

You can use wevtutill to query events on the commandline.

Note that contrary to [WayBack] WEVTUTIL – Windows CMD – SS64.com documentation, the option /rd cannot be expanded to /reversedirection , as you will get an error “invalid option reversedirection” – Google Search.

For querying the above defrag event, use this command line (replace /format:XML with /format:text for more readable but also more verbose output):

wevtutil query-events Application /count:2 /format:XML /rd:true /query:"*[System[(EventID=259)]]"

On Windows 10, this is often caused by “System Protection” which locks files under C:\Recovery, but I have also seen $BITMAP, $MFT and $DATA entries.

System protected drives

To view which drives are currently used for system protection (this opens the “System Properties” dialog focussed on the “System Protection” tab):

SystemPropertiesProtection.exe

To disable it for one drive:

Disable-ComputerRestore -Drive "C:"

To enable it for one drive:

Enable-ComputerRestore -Drive "C:"

There seems to be no easy one-command PowerShell way to view the drives have ComputerRestore enabled, as this does not show drive letters:

PowerShell Get-ComputerRestorePoint ^| Format-List

The above gives more detailed output than a plain PowerShell Get-ComputerRestorePoint

Deleting restore points

PowerShell does not have a built-in option to delete restore points, but vssadmin has, but calls them “shadows”.

First list them:

vssadmin list shadows

Then delete them (but be aware this will not prompt for confirmation because of the /quiet):

vssadmin delete shadows /for=C: /quiet

You can also delete them for all drives (this will not prompt for confirmation either):

vssadmin delete shadows /all /quiet

Stopping the volume shadow copy service:

net stop vss

Managing hibernation and page file

Hibernation:

powercfg.exe /hibernate off

powercfg.exe /hibernate on

Page file:

wmic pagefile list /format:list
AllocatedBaseSize=2944

CurrentUsage=0
Description=C:\pagefile.sys
InstallDate=20181018215808.683376+120
Name=C:\pagefile.sys
PeakUsage=0
Status=
TempPageFile=FALSE

wmic computersystem where name="%computername%" get AutomaticManagedPagefile
AutomaticManagedPagefile
TRUE

wmic computersystem where name="%computername%" set AutomaticManagedPagefile=False
Updating property(s) of '\\MYCOMPUTER\ROOT\CIMV2:Win32_ComputerSystem.Name="LAPTOPUW08"'
Property(s) update successful.

wmic computersystem where name="%computername%" get AutomaticManagedPagefile
AutomaticManagedPagefile
FALSE

wmic.exe pagefileset where name="C:\\pagefile.sys" delete
Deleting instance \\MYCOMPUTER\ROOT\CIMV2:Win32_PageFileSetting.Name="C:\\pagefile.sys"
Instance deletion successful.

Sometimes the deletion does not work (see below for workaround):

wmic pagefile list /format:list

AllocatedBaseSize=2944
CurrentUsage=0
Description=C:\pagefile.sys
InstallDate=20181018215808.683376+120
Name=C:\pagefile.sys
PeakUsage=0
Status=
TempPageFile=FALSE

Do not do this:

wmic pagefile delete
Deleting instance \\MYCOMPUTER\ROOT\CIMV2:Win32_PageFileUsage.Name="C:\\pagefile.sys"
ERROR:
Description = Provider is not capable of the attempted operation

wmic pagefileset set name="c:\\pagefile.sys",InitialSize=0,MaximumSize=0
No Instance(s) Available.

Sometimes it still fails, so then you have to use the UI:

  1. Run SystemPropertiesAdvanced.exe
  2. Under Performance, click on Settings
  3. Click the Advanced tab
  4. Under Virtual memory, click the Change button
  5. Ensure Automatically manage page file size for all drives is disabled
  6. Ensure No paging file is selected
  7. Click the Set button
  8. Confirm you really want no page file
  9. Press on the three OK buttons to fully leave the Advanced System Properties dialog.
  10. Reboot

After resizing the disk, reverse the steps:

  1. Run SystemPropertiesAdvanced.exe
  2. Under Performance, click on Settings
  3. Click the Advanced tab
  4. Under Virtual memory, click the Change button
  5. Ensure Automatically manage page file size for all drives is enabled
  6. Confirm you really want no page file
  7. Press on the three OK buttons to fully leave the Advanced System Properties dialog.
  8. Reboot

Bitmap file

Sometimes the file blocking the resize is the NTFS "\$BitMap::$DATA", which few defragmentation tools can move as it is the MFT Bitmap.

Background reading

–jeroen

Posted in CommandLine, Console (command prompt window), Development, Power User, PowerShell, PowerShell, Scripting, Software Development, Windows | Leave a Comment »

David Korn Tells All – Slashdot

Posted by jpluimers on 2020/05/21

Almost 20 years old, but still a very nice read [Archive.is] David Korn Tells All – Slashdot.

Another funny story involving David Korn during the not-so open source times of Microsoft late last century: [WayBack] Korn Shell Story

–jeroen

Posted in *nix, *nix-tools, bash, bash, Development, History, Power User, Scripting, Software Development | Leave a Comment »