[!TIP|label:references]

get file metadata

[!NOTE|label:references:]

mdls - metadata list

$ mdls nvim-macos-arm64.tar.gz
_kMDItemDisplayNameWithExtensions  = "nvim-macos-arm64.tar.gz"
kMDItemContentCreationDate         = 2024-12-07 05:41:06 +0000
kMDItemContentCreationDate_Ranking = 2024-12-07 00:00:00 +0000
kMDItemContentModificationDate     = 2024-12-07 05:41:07 +0000
kMDItemContentType                 = "org.gnu.gnu-zip-archive"
kMDItemContentTypeTree             = (
    "org.gnu.gnu-zip-archive",
    "public.data",
    "public.item",
    "public.archive"
)
kMDItemDateAdded                   = 2024-12-07 05:41:08 +0000
kMDItemDisplayName                 = "nvim-macos-arm64.tar.gz"
kMDItemDocumentIdentifier          = 0
kMDItemFSContentChangeDate         = 2024-12-07 05:41:07 +0000
kMDItemFSCreationDate              = 2024-12-07 05:41:06 +0000
kMDItemFSCreatorCode               = ""
kMDItemFSFinderFlags               = 0
kMDItemFSHasCustomIcon             = (null)
kMDItemFSInvisible                 = 0
kMDItemFSIsExtensionHidden         = 0
kMDItemFSIsStationery              = (null)
kMDItemFSLabel                     = 0
kMDItemFSName                      = "nvim-macos-arm64.tar.gz"
kMDItemFSNodeCount                 = (null)
kMDItemFSOwnerGroupID              = 20
kMDItemFSOwnerUserID               = 503
kMDItemFSSize                      = 8796470
kMDItemFSTypeCode                  = ""
kMDItemInterestingDate_Ranking     = 2024-12-07 00:00:00 +0000
kMDItemKind                        = "gzip compressed archive"
kMDItemLogicalSize                 = 8796470
kMDItemPhysicalSize                = 8798208
kMDItemWhereFroms                  = (
    "https://objects.githubusercontent.com/github-production-release-asset-2e65be/16408992/ad802a23-1166-4836-8c5d-d9f285880360?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=releaseassetproduction%2F20241207%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20241207T054106Z&X-Amz-Expires=300&X-Amz-Signature=86c4bbf765c39941538a221b8c3a11f89961aef680a05a0995545a9a03175656&X-Amz-SignedHeaders=host&response-content-disposition=attachment%3B%20filename%3Dnvim-macos-arm64.tar.gz&response-content-type=application%2Foctet-stream",
    "https://github.com/neovim/neovim/releases/tag/v0.10.2"
)

xattr

$ xattr nvim-macos-arm64.tar.gz
com.apple.macl
com.apple.metadata:kMDItemWhereFroms
com.apple.quarantine

$ xattr -l nvim-macos-arm64.tar.gz
com.apple.macl:
com.apple.metadata:kMDItemWhereFroms: bplist00�_https://objects.githubusercontent.com/github-production-release-asset-2e65be/16408992/ad802a23-1166-4836-8c5d-d9f285880360?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=releaseassetproduction%2F20241207%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20241207T054106Z&X-Amz-Expires=300&X-Amz-Signature=86c4bbf765c39941538a221b8c3a11f89961aef680a05a0995545a9a03175656&X-Amz-SignedHeaders=host&response-content-disposition=attachment%3B%20filename%3Dnvim-macos-arm64.tar.gz&response-content-type=application%2Foctet-stream_5https://github.com/neovim/neovim/releases/tag/v0.10.2
com.apple.quarantine: 0081;6753dff2;Chrome;

exiftool

[!NOTE|label:references:]

  • install via:
    $ brew install exiftool
    
$ exiftool nvim-macos-arm64.tar.gz
ExifTool Version Number         : 13.00
File Name                       : nvim-macos-arm64.tar.gz
Directory                       : .
File Size                       : 8.8 MB
File Modification Date/Time     : 2024:12:06 21:41:07-08:00
File Access Date/Time           : 2024:12:06 21:41:10-08:00
File Inode Change Date/Time     : 2024:12:06 21:41:09-08:00
File Permissions                : -rw-r--r--
File Type                       : GZIP
File Type Extension             : gz
MIME Type                       : application/x-gzip
Compression                     : Deflated
Flags                           : (none)
Modify Date                     : 2024:10:03 02:00:52-07:00
Extra Flags                     : (none)
Operating System                : Unix

sips - images

$ sips -g all kubernetes-operator.png
/Users/marslo/Desktop/kubernetes-operator.png
  pixelWidth: 2560
  pixelHeight: 2560
  typeIdentifier: public.png
  format: png
  formatOptions: default
  dpiWidth: 72.000
  dpiHeight: 72.000
  samplesPerPixel: 3
  bitsPerSample: 8
  hasAlpha: no
  space: RGB

$ sips -g all JCasC.svg
/Users/marslo/Desktop/JCasC.svg
  pixelWidth: 825.640
  pixelHeight: 1024.000
  typeIdentifier: public.svg-image
  format: svg
  formatOptions: default
  dpiWidth: 72.000
  dpiHeight: 72.000
  hasAlpha: no

identify - images

$ identify -verbose kubernetes-operator.png
Image:
  Filename: kubernetes-operator.png
  Permissions: rw-r--r--
  Format: PNG (Portable Network Graphics)
  Mime type: image/png
  Class: DirectClass
  Geometry: 2560x2560+0+0
  Resolution: 28.34x28.34
  Print size: 90.3317x90.3317
  Units: PixelsPerCentimeter
  Colorspace: sRGB
  Type: TrueColor
  ...

$ identify -verbose JCasC.svg
Image:
  Filename: JCasC.svg
  Permissions: rw-------
  Format: SVG (Scalable Vector Graphics)
  Mime type: image/svg+xml
  Class: DirectClass
  Geometry: 826x1024+0+0
  Units: Undefined
  Colorspace: sRGB
  Type: TrueColorAlpha
  Base type: Undefined
  Endianness: Undefined
  Depth: 16-bit
  ...

copy path

copy STDOUT into clipboard

[!NOTE]

  • pbcopy for macOS
  • xclip for Linux
$ <cmd> | pbcopy
  • example
    $ cat file | pbcopy
    $ pwd | pbcopy
    

copy path from finder

option key
1.8.6.1 -- option key
  • Automator -> Quick Action
create quick action
1.8.6.2 -- create quick action
content menu
1.8.6.3 -- content menu
  • Automator -> Apple Script

    on run {input, parameters}
    
      try
        tell application "Finder" to set the clipboard to POSIX path of (target of window 1 as alias)
      on error
        beep
      end try
    
      return input
    end run
    
copy path apple script
1.8.6.4 -- copy path apple script
copy path shortcut key
1.8.6.5 -- copy path shortcut key

input method auto switch

im-select

$ brew tap daipeihust/tap
$ brew install im-select

# or
$ curl -Ls https://raw.githubusercontent.com/daipeihust/im-select/master/install_mac.sh | sh

# or compile from source
$ git clone https://github.com/laishulu/macism /tmp/macism
$ cd /tmp/macism && swiftc macism.swift -o macism
$ sudo mv macism /usr/local/bin/

macime

$ brew tap riodelphino/tap
$ brew install macime
# list all input method
$ macime list
com.apple.keylayout.US
com.apple.CharacterPaletteIM
com.apple.inputmethod.ironwood
com.sogou.inputmethod.sogou.pinyin
com.sogou.inputmethod.sogou

# get current input method
$ macime get
com.sogou.inputmethod.sogou.pinyin

# switch input method
$ macime set com.apple.keylayout.US
" autocmd for force change input method
if executable('macime')
  let g:ime_en = 'com.apple.keylayout.US'
  augroup Ime_Switch
    autocmd!
    autocmd FocusGained  * call system( 'macime set ' . g:ime_en )
    autocmd InsertLeave  * call system( 'macime set ' . g:ime_en )
    autocmd CmdlineLeave * call system( 'macime set ' . g:ime_en )
  augroup END
endif

" --- or ---
if executable('macime')
  let g:ime_en = 'com.apple.keylayout.US'
  augroup Ime_Switch
    autocmd!
    autocmd WinEnter     * silent! call system( 'macime set ' . g:ime_en . ' &>/dev/null &' )
    autocmd InsertLeave  * silent! call system( 'macime set ' . g:ime_en . ' &>/dev/null &' )
    autocmd CmdlineLeave * silent! call system( 'macime set ' . g:ime_en . ' &>/dev/null &' )
  augroup END
endif

macism

$ brew tap laishulu/homebrew
$ brew install macism

create app

[!NOTE|label:references:]

cleanup icon cache and rebuild

$ sudo rm -rf "/Library/Caches/com.apple.iconservices.store"
$ killall -KILL iconservicesd
$ killall Finder Dock

groovyConsole

[!NOTE|label:Expectation:] case: run groovyConsole from Spotlight or Alfred

via Automator.app

[!NOTE|label:tips] Automator.app will create whole bunch of necessary files for app. only need to replace the CFBundleExecutable filename

  • Open Automator.app » New » Application

    Automator.app » select Application
    1.8.6.6 -- Automator.app » select Application
  • Select Run Shell Script » save to .app with empty shell script

    Automator.app » select Run Shell Script
    1.8.6.7 -- Automator.app » select Run Shell Script
    Automator.app » save to an app
    1.8.6.8 -- Automator.app » save to an app

via script

[!NOTE|label:tips:]

  • get standalone commands for the script

    $ ps aux | grep groovyConsole | grep -v grep
    marslo           63030   0.0  1.9 42636292 310724 s008  S+    2:06PM   0:12.48 /usr/local/opt/openjdk/bin/java -Dsun.awt.keepWorkingSetOnMinimize=true -Xdock:name=GroovyConsole -Xdock:icon=/usr/local/opt/groovy/libexec/lib/groovy.icns -classpath /usr/local/opt/groovy/libexec/lib/groovy-4.0.13.jar -Dscript.name=/usr/local/opt/groovy/libexec/bin/groovyConsole -Dprogram.name=groovyConsole -Dgroovy.starter.conf=/usr/local/opt/groovy/libexec/conf/groovy-starter.conf -Dgroovy.home=/usr/local/opt/groovy/libexec -Dtools.jar=/usr/local/opt/openjdk/lib/tools.jar org.codehaus.groovy.tools.GroovyStarter --main groovy.console.ui.Console --conf /usr/local/opt/groovy/libexec/conf/groovy-starter.conf --classpath .:/usr/local/opt/openjdk/lib/tools.jar:/usr/local/opt/openjdk/lib/dt.jar:/usr/local/opt/groovy/libexec/lib:.
    

    ==> which would be:

    /usr/local/opt/openjdk/bin/java \
         -Dsun.awt.keepWorkingSetOnMinimize=true \
         -Xdock:name=GroovyConsole \
         -Xdock:icon=/usr/local/opt/groovy/libexec/lib/groovy.icns \
         -classpath /usr/local/opt/groovy/libexec/lib/groovy-4.0.13.jar \
         -Dscript.name=/usr/local/opt/groovy/libexec/bin/groovyConsole \
         -Dprogram.name=groovyConsole \
         -Dgroovy.starter.conf=/usr/local/opt/groovy/libexec/conf/groovy-starter.conf \
         -Dgroovy.home=/usr/local/opt/groovy/libexec \
         -Dtools.jar=/usr/local/opt/openjdk/lib/tools.jar org.codehaus.groovy.tools.GroovyStarter \
         --main groovy.console.ui.Console \
         --conf /usr/local/opt/groovy/libexec/conf/groovy-starter.conf \
         --classpath .:/usr/local/opt/openjdk/lib/tools.jar:/usr/local/opt/openjdk/lib/dt.jar:/usr/local/opt/groovy/libexec/lib:.
    
    older version
    $ ps aux | grep groovyConsole | grep -v grep
    marslo           50495   0.0  3.4 11683536 577828   ??  S     5:50PM   0:15.85 /Library/Java/JavaVirtualMachines/jdk1.8.0_211.jdk/Contents/Home/bin/java -Xdock:name=GroovyConsole -Xdock:icon=/usr/local/opt/groovy/libexec/lib/groovy.icns -Dgroovy.jaxb=jaxb -classpath /usr/local/opt/groovy/libexec/lib/groovy-3.0.6.jar -Dscript.name=/usr/local/opt/groovy/libexec/bin/groovyConsole -Dprogram.name=groovyConsole -Dgroovy.starter.conf=/usr/local/opt/groovy/libexec/conf/groovy-starter.conf -Dgroovy.home=/usr/local/opt/groovy/libexec -Dtools.jar=/Library/Java/JavaVirtualMachines/jdk1.8.0_211.jdk/Contents/Home/lib/tools.jar org.codehaus.groovy.tools.GroovyStarter --main groovy.console.ui.Console --conf /usr/local/opt/groovy/libexec/conf/groovy-starter.conf --classpath .:/Library/Java/JavaVirtualMachines/jdk1.8.0_211.jdk/Contents/Home/lib/tools.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_211.jdk/Contents/Home/lib/dt.jar:/usr/local/opt/groovy/libexec/lib:.
    

    ==> which would be:

    /Library/Java/JavaVirtualMachines/jdk1.8.0_211.jdk/Contents/Home/bin/java \
            -Xdock:name=GroovyConsole \
            -Xdock:icon=/usr/local/opt/groovy/libexec/lib/groovy.icns \
            -Dgroovy.jaxb=jaxb \
            -classpath /usr/local/opt/groovy/libexec/lib/groovy-3.0.6.jar \
            -Dscript.name=/usr/local/opt/groovy/libexec/bin/groovyConsole \
            -Dprogram.name=groovyConsole \
            -Dgroovy.starter.conf=/usr/local/opt/groovy/libexec/conf/groovy-starter.conf \
            -Dgroovy.home=/usr/local/opt/groovy/libexec \
            -Dtools.jar=/Library/Java/JavaVirtualMachines/jdk1.8.0_211.jdk/Contents/Home/lib/tools.jar org.codehaus.groovy.tools.GroovyStarter \
            --main groovy.console.ui.Console \
            --conf /usr/local/opt/groovy/libexec/conf/groovy-starter.conf \
            --classpath .:/Library/Java/JavaVirtualMachines/jdk1.8.0_211.jdk/Contents/Home/lib/tools.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_211.jdk/Contents/Home/lib/dt.jar:/usr/local/opt/groovy/libexec/lib:.
    

[!TIP|label:register openjdk]

# -- -v 21 --
$ brew install openjdk@21
$ sudo ln -sfn "$(brew --prefix openjdk@21)/libexec/openjdk.jdk" /Library/Java/JavaVirtualMachines/openjdk-21.jdk

# -- -v 24 --
$ brew install openjdk
$ sudo ln -sfn "$(brew --prefix openjdk)/libexec/openjdk.jdk" /Library/Java/JavaVirtualMachines/openjdk-24.jdk

# check
$ /usr/libexec/java_home -V
$ cp /usr/local/opt/groovy/libexec/lib/groovy.icns groovyConsole.app/Contents/Resources

$ cat > groovyConsole.app/Contents/MacOS/groovyConsole << EOF
  -> #!/usr/bin/env bash
  ->
  -> JAVA_HOME="$(/usr/libexec/java_home -v 21)"
  -> GROOVY_HOME="$(/usr/local/bin/brew --prefix groovy)/libexec"
  -> GROOVY_VERSION="$(/usr/bin/sed -rn 's/^[^:]+:[[:blank:]]?([[:digit:].]+)[[:blank:]]?.+$/\1/p' < <(${GROOVY_HOME}/bin/groovy --version))"
  ->
  -> "${JAVA_HOME}"/bin/java \
  ->   -Dsun.awt.keepWorkingSetOnMinimize=true \
  ->   -Xdock:name=GroovyConsole \
  ->   -Xdock:icon="${GROOVY_HOME}"/lib/groovy.icns \
  ->   -classpath "${GROOVY_HOME}"/lib/groovy-"${GROOVY_VERSION}".jar \
  ->   -Dscript.name="${GROOVY_HOME}"/bin/groovyConsole \
  ->   -Dprogram.name=groovyConsole \
  ->   -Dgroovy.starter.conf="${GROOVY_HOME}"/conf/groovy-starter.conf \
  ->   -Dgroovy.home="${GROOVY_HOME}" \
  ->   -Dtools.jar="${JAVA_HOME}"/lib/tools.jar org.codehaus.groovy.tools.GroovyStarter \
  ->   --main groovy.console.ui.Console \
  ->   --conf "${GROOVY_HOME}"/conf/groovy-starter.conf \
  ->   --classpath .:"${JAVA_HOME}"/lib/tools.jar:"${JAVA_HOME}"/lib/dt.jar:"${GROOVY_HOME}"/lib
  -> EOF

  # or HOMEBREW_PREFIX='/opt/homebrew'
  #!/usr/bin/env bash

  HOMEBREW_PREFIX='/opt/homebrew'
  JAVA_HOME="${HOMEBREW_PREFIX}"/opt/openjdk
  export JAVA_HOME
  GROOVY_HOME="$("${HOMEBREW_PREFIX}"/bin/brew --prefix groovy)/libexec"
  GROOVY_VERSION="$(/usr/bin/sed -rn 's/^[^:]+:[[:blank:]]?([[:digit:].]+)[[:blank:]]?.+$/\1/p' < <("${GROOVY_HOME}"/bin/groovy --version))"
  "${JAVA_HOME}"/bin/java \
      -Dsun.awt.keepWorkingSetOnMinimize=true \
      -Xdock:name=GroovyConsole \
      -Xdock:icon="${GROOVY_HOME}"/lib/groovy.icns \
      -classpath "${GROOVY_HOME}"/lib/groovy-"${GROOVY_VERSION}".jar \
      -Dscript.name="${GROOVY_HOME}"/bin/groovyConsole \
      -Dprogram.name=groovyConsole \
      -Dgroovy.starter.conf="${GROOVY_HOME}"/conf/groovy-starter.conf \
      -Dgroovy.home="${GROOVY_HOME}" \
      -Dtools.jar="${JAVA_HOME}"/lib/tools.jar org.codehaus.groovy.tools.GroovyStarter \
      --main groovy.console.ui.Console \
      --conf "${GROOVY_HOME}"/conf/groovy-starter.conf \
      --classpath .:"${JAVA_HOME}"/lib/tools.jar:"${JAVA_HOME}"/lib/dt.jar:"${GROOVY_HOME}"/lib:.

  # vim:tabstop=2:softtabstop=2:shiftwidth=2:expandtab:filetype=sh

  #--------------------------------------------------------------------------------------#

  $ chmod +x groovyConsole.app/Contents/MacOS/groovyConsole
  $ ls -1 groovyConsole.app/Contents/MacOS/
  Automator Application Stub                    # ignore it
  groovyConsole                                 # ╮ <key>CFBundleExecutable</key>
                                                # ╯ <string>groovyConsole</string>

  $ mv groovyConsole.app/ /Applications/
older version
  $ touch groovyConsole.app/Contents/MacOS/groovyConsole
  $ cat > groovyConsole.app/Contents/MacOS/groovyConsole << EOF
    -> #!/usr/bin/env bash
    ->
    -> JAVA_HOME="$(/usr/local/bin/brew --prefix java)"
    -> # JAVA_HOME="$(/usr/local/bin/brew --prefix openjdk@17)"
    -> GROOVY_VERSION="$(/usr/local/bin/groovy --version | /usr/local/opt/gnu-sed/libexec/gnubin/sed -rn 's/^[^:]+:\s*([0-9\.]+).*$/\1/p')"
    -> GROOVY_HOME="$(/usr/local/bin/brew --prefix groovy)/libexec"
    ->
    -> "${JAVA_HOME}"/bin/java \
    ->     -Dsun.awt.keepWorkingSetOnMinimize=true \
    ->     -Xdock:name=GroovyConsole \
    ->     -Xdock:icon="${GROOVY_HOME}"/lib/groovy.icns \
    ->     -classpath "${GROOVY_HOME}"/lib/groovy-"${GROOVY_VERSION}".jar \
    ->     -Dscript.name="${GROOVY_HOME}"/bin/groovyConsole \
    ->     -Dprogram.name=groovyConsole \
    ->     -Dgroovy.starter.conf="${GROOVY_HOME}"/conf/groovy-starter.conf \
    ->     -Dgroovy.home="${GROOVY_HOME}" \
    ->     -Dtools.jar="${JAVA_HOME}"/lib/tools.jar \
    ->     org.codehaus.groovy.tools.GroovyStarter \
    ->         --main groovy.console.ui.Console \
    ->         --conf "${GROOVY_HOME}"/conf/groovy-starter.conf \
    ->         --classpath .:"${JAVA_HOME}"/lib/tools.jar:"${JAVA_HOME}"/lib/dt.jar:"${GROOVY_HOME}"/lib:.
    -> EOF

  # or
  $ cat > groovyConsole.app/Contents/MacOS/groovyConsole << EOF
    -> #!/bin/bash
    -> /Library/Java/JavaVirtualMachines/jdk1.8.0_211.jdk/Contents/Home/bin/java \\
    ->         -Xdock:name=GroovyConsole \\
    ->         -Xdock:icon=/usr/local/opt/groovy/libexec/lib/groovy.icns \\
    ->         -Dgroovy.jaxb=jaxb \\
    ->         -classpath /usr/local/opt/groovy/libexec/lib/groovy-3.0.6.jar \\
    ->         -Dscript.name=/usr/local/opt/groovy/libexec/bin/groovyConsole \\
    ->         -Dprogram.name=groovyConsole \\
    ->         -Dgroovy.starter.conf=/usr/local/opt/groovy/libexec/conf/groovy-starter.conf \\
    ->         -Dgroovy.home=/usr/local/opt/groovy/libexec \\
    ->         -Dtools.jar=/Library/Java/JavaVirtualMachines/jdk1.8.0_211.jdk/Contents/Home/lib/tools.jar org.codehaus.groovy.tools.GroovyStarter \\
    ->         --main groovy.console.ui.Console \\
    ->         --conf /usr/local/opt/groovy/libexec/conf/groovy-starter.conf \\
    ->         --classpath .:/Library/Java/JavaVirtualMachines/jdk1.8.0_211.jdk/Contents/Home/lib/tools.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_211.jdk/Contents/Home/lib/dt.jar:/usr/local/opt/groovy/libexec/lib:.
    -> EOF

  $ chmod +x groovyConsole.app/Contents/MacOS/groovyConsole
  • try validate via execute groovyConsole.app/Contents/MacOS/groovyConsole directly. to see whether if the groovyConsole will be opened.

    Automator.app » show in Alfred
    1.8.6.9 -- Automator.app » show in Alfred

modify Info.plist

$ vim groovyConsole.app/Contents/Info.plist
...
<key>CFBundleExecutable</key>
<string>groovyConsole</string>           « the script name to MacOS/groovyConsole
<key>CFBundleIconFile</key>
<string>groovy</string>                  « for icon in Resources/groovy.icns
<key>CFBundleIdentifier</key>
<string>com.apple.groovyConsole</string>
...
  • original
    <key>CFBundleExecutable</key>
    <string>Application Stub</string>
    <key>CFBundleIconFile</key>
    <string>AutomatorApplet</string>
    <key>CFBundleIdentifier</key>
    <string>com.apple.automator.groovyConsole</string>
    

additional

  • set the icon for new app

    [!NOTE|label:optional]

    $ cp /usr/local/opt/groovy/libexec/lib/groovy.icns groovyConsole.app/Contents/Resources
    
    # or
    $ ln -sf /usr/local/opt/groovy/libexec/lib/groovy.icns groovyConsole.app/Contents/Resources/groovy.icns
    
  • create dmg

    $ hdiutil create -volname 'groovyConsole' \
                     -srcfolder ~/Desktop/groovyConsole.app \
                     -ov groovyConsole.dmg
    .......................
    created: /Users/marslo/Desktop/groovyConsole.dmg
    

python3 IDLE

[!NOTE|label:references:]

  • python-tk@version is necessary for IDLE to work
    $ brew install python-tk@3.11
    $ brew install python-tk@3.12
    $ brew install python-tk@3.13
    $ brew install python-tk@3.14
    

via automator.app

  • script

    [!TIP|label:tips:]

    • the IDLE python version is based on which python is linked to /usr/local/bin/python3
    #!/usr/bin/env bash
    
    set -euo pipefail
    
    die() { printf >&2 ">> ERROR [IDLE] %s\n" "$*"; exit 1; }
    
    HOMEBREW_PREFIX="/opt/homebrew"
    PYTHON_SHORT_VERSION=$(/usr/bin/sed -rn 's/^([^[0-9]+)([0-9]+\.[0-9]+).*$/\2/p' < <("${HOMEBREW_PREFIX}"/bin/python3 --version) )
    PYTHON_TK_HOME="${HOMEBREW_PREFIX}/opt/python-tk@${PYTHON_SHORT_VERSION}"
    TCLTK_HOME="${HOMEBREW_PREFIX}/opt/tcl-tk"
    
    test -d "${PYTHON_TK_HOME}" || die "The python-tk@${PYTHON_SHORT_VERSION} formula is not installed. Please install it with '\$ brew install python-tk@${PYTHON_SHORT_VERSION}' and try again."
    test -f "${TCLTK_HOME}/lib/pkgconfig/tk.pc" || die "The tcl-tk formula is not installed. Please install it with '\$ brew install tcl-tk' and try again."
    command -v "${TCLTK_HOME}/bin/wish" || die "wish not found under ${TCLTK_PREFIX}/bin, please check your tcl-tk installation."
    
    /usr/bin/open "$("${HOMEBREW_PREFIX}"/bin/brew --prefix python@"${PYTHON_SHORT_VERSION}")"/IDLE\ 3.app
    
    # vim:tabstop=2:softtabstop=2:shiftwidth=2:expandtab:filetype=sh
    
    script in automator.app
    1.8.6.10 -- script in automator.app
  • icon

    $ PYTHON_SHORT_VERSION=$(/usr/bin/sed -rn 's/^([^[0-9]+)([0-9]+\.[0-9]+).*$/\2/p' < <("${HOMEBREW_PREFIX}"/bin/python3 --version) )
    $ cp "$("${HOMEBREW_PREFIX}"/bin/brew --prefix python@${PYTHON_SHORT_VERSION})"/IDLE\ 3.app/Contents/Resources/IDLE.icns Python3\ IDLE.app/Contents/Resources/
    
    # modify "Python3 IDLE.app/Contents/Info.plist"
    $ PLIST="Python3 IDLE.app/Contents/Info.plist"
    $ /usr/libexec/PlistBuddy -c 'Delete :CFBundleIconName' "${PLIST}" 2>/dev/null || true
    $ /usr/libexec/PlistBuddy -c 'Set :CFBundleIconFile IDLE' "${PLIST}"
    # -- verify --
    $ /usr/libexec/PlistBuddy -c 'Print :CFBundleIconFile' "${PLIST}" 2>/dev/null
    IDLE
    $ plutil -p "${PLIST}" | rg 'CFBundleIcon(File|Name)'
    "CFBundleIconFile" => "IDLE"
    
    # -- result --
    <key>CFBundleIconFile</key>
    <string>IDLE</string>
    # -- original --
    <key>CFBundleIconFile</key>
    <string>ApplicationStub</string>
    
    # refresh icon cache
    $ /usr/bin/touch Python3\ IDLE.app
    
    • others
      $ cat IDLE.app/Contents/Info.plist
      <key>CFBundleGetInfoString</key>
      <string>3.11.6, © 2001-2023 Python Software Foundation</string>
      <key>CFBundleIconFile</key>
      <string>IDLE.icns</string>
      <key>CFBundleIdentifier</key>
      <string>org.python.IDLE</string>
      

via appify

[!NOTE|label:references:]

  • shell script

    $ cat > ~/IDLE << EOF
    #!/usr/bin/env bash
    
    set -euo pipefail
    
    die() { printf >&2 ">> ERROR [IDLE] %s\n" "$*"; exit 1; }
    
    HOMEBREW_PREFIX="/opt/homebrew"
    PYTHON_SHORT_VERSION=$(/usr/bin/sed -rn 's/^([^[0-9]+)([0-9]+\.[0-9]+).*$/\2/p' < <("${HOMEBREW_PREFIX}"/bin/python3 --version) )
    PYTHON_TK_HOME="${HOMEBREW_PREFIX}/opt/python-tk@${PYTHON_SHORT_VERSION}"
    TCLTK_HOME="${HOMEBREW_PREFIX}/opt/tcl-tk"
    
    test -d "${PYTHON_TK_HOME}" || die "The python-tk@${PYTHON_SHORT_VERSION} formula is not installed. Please install it with '\$ brew install python-tk@${PYTHON_SHORT_VERSION}' and try again."
    test -f "${TCLTK_HOME}/lib/pkgconfig/tk.pc" || die "The tcl-tk formula is not installed. Please install it with '\$ brew install tcl-tk' and try again."
    command -v "${TCLTK_HOME}/bin/wish" || die "wish not found under ${TCLTK_PREFIX}/bin, please check your tcl-tk installation."
    
    /usr/bin/open "$("${HOMEBREW_PREFIX}"/bin/brew --prefix python@"${PYTHON_SHORT_VERSION}")"/IDLE\ 3.app
    
    # vim:tabstop=2:softtabstop=2:shiftwidth=2:expandtab:filetype=sh
    EOF
    
  • create app via appify

    $ icon=$(brew --prefix python@3.12)/IDLE\ 3.app/Contents/Resources/IDLE.icns
    $ ./appify.sh -i ${icon} -s IDLE -n IDLE
    $ mv IDLE.app /Applications
    
    IDLE.app
    1.8.6.11 -- IDLE.app
  • more:

    • Info.plist

      macOS 15.x
      <?xml version="1.0" encoding="UTF-8"?>
      <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
      <plist version="1.0">
      <dict>
        <key>CFBundleDevelopmentRegion</key>
        <string>English</string>
        <key>CFBundleExecutable</key>
        <string>IDLE</string>
        <key>CFBundleIconFile</key>
        <string>IDLE</string>
        <key>CFBundleIdentifier</key>
        <string>com.apple.automator.Python3-IDLE</string>
        <key>CFBundleName</key>
        <string>Python3 IDLE</string>
        <key>CFBundlePackageType</key>
        <string>APPL</string>
      </dict>
      </plist>
      
      macOS 14.x
      <?xml version="1.0" encoding="UTF-8"?>
      <!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
      <plist version="1.0">
      <dict>
        <key>CFBundleExecutable</key>
        <string>IDLE</string>
        <key>CFBundleGetInfoString</key>
        <string>IDLE</string>
        <key>CFBundleIconFile</key>
        <string>IDLE</string>
        <key>CFBundleName</key>
        <string>IDLE</string>
        <key>CFBundlePackageType</key>
        <string>APPL</string>
        <key>CFBundleIdentifier</key>
        <string>org.python.IDLE</string>
      </dict>
      </plist>
      
    • create dmg

      $ hdiutil create -volname IDLE -srcfolder ~/Desktop/IDLE.app -ov IDLE.dmg
      ....
      created: /Users/marslo/Desktop/IDLE.dmg
      
      # -- or --
      $ hdiutil create -volname 'Python3 IDLE' -srcfolder "$HOME/Desktop/Python3 IDLE.app" -ov "Python3 IDLE.dmg"
      
    • change default python3

      $ ln -sf /usr/local/bin/python3.12        /usr/local/bin/python3
      $ ln -sf /usr/local/bin/python3.12-config /usr/local/bin/python3-config
      
      # or
      $ brew unlink python@3.11
      $ brew unlink python@3.12
      $ brew link --force python@3.12
      
      # or
      $ brew link --force --overwrite python@3.12
      

create dmg

reset file associations

[!NOTE|label:references:]

# reloading generators list
$ qlmanage -r

# resets the quicklook database
$ /System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/LaunchServices.framework/Versions/A/Support/lsregister -kill -seed
# or
$ find /System/Library/Frameworks -type f -name "lsregister" -exec {} -kill -seed -r \;

add snippets for input

enable Technical Symbols

  • Input Method ⇢ Show emoji and symbols

    show emoji & symbols
    1.8.6.12 -- show emoji & symbols
  • Open Customized ListTechnical Symbols

    customized list
    1.8.6.13 -- customized list
    technical symbols
    1.8.6.14 -- technical symbols

and snippets

  • go to System PreferencesKeyboardTest
  • add snippets as below

    snippets
    1.8.6.15 -- snippets

finally

test-1
1.8.6.16 -- test-1
test-2
1.8.6.17 -- test-2

unicode hex input

[!NOTE|label:references:]

unicode hex input
1.8.6.18 -- unicode hex input

settings

  • click input methodOpen Keyboard Settings...

    keyboard settings
    1.8.6.19 -- keyboard settings
  • click +OthersUnicode Hex Input

    unicode hex input
    1.8.6.20 -- unicode hex input

others

install font

$ curl --create-dirs \
       -O \
       --output-dir ~/.fonts \
       https://dtinth.github.io/comic-mono-font/ComicMono.ttf && \
  curl --create-dirs \
       -O \
       --output-dir ~/.fonts \
       https://dtinth.github.io/comic-mono-font/ComicMono-Bold.ttf &&
  fc-cache -f -v

create image

[!NOTE|label:references:]

background images

image 1
1.8.6.21 -- image 1
image 2
1.8.6.22 -- image 2
image 3
1.8.6.23 -- image 3

create dmg from app

  • via hdiutil

    [!NOTE|label:references:]

    • -format:
      • UDRW: read/write image
      • UDRO: read-only image
      • UDCO: ADC-compressed image
      • UDZO: zlib-compressed image
      • UDBZ: bzip2-compressed image
      • ULFO: lzfse-compressed image, introduced in macOS 10.11
      • ULMO: lzma-compressed image, introduced in macOS 10.15
      • UDTO: DVD/CD-R master for export
      • UDSP: SPARSE (grows with content)
      • UDSB: SPARSEBUNDLE (grows with content; bundle-backed)
      • UFBI: UDIF entire image with MD5 checksum
    $ hdiutil create -srcfolder "/Applications/Python3 IDLE.app" \
                     -volname 'Python3 IDLE' \
                     -fs HFS+ \
                     -fsargs "-c c=64,a=16,e=16" \
                     -format UDRW \
                     "Python3 IDLE.dmg" [ --debug ] [ --verbose ]
    
    # or
    $ hdiutil create -volname "Volume Name" \
                     -srcfolder /path/to/folder \
                     -ov diskimage.dmg
    
    # create encrypted image
    $ hdiutil create encrypted.dmg
                     -encryption AES-128 \
                     -stdinpass \
                     -volname "Volume Name" \
                     -srcfolder /path/to/folder \
                     -ov                       # overwrite any existing files
    # i.e.:
    $ hdiutil create mEncrypted.dmg \
                     -encryption \
                     -size 1g \
                     -volname "mEncrypted Disk Image" \
                     -fs JHFS+ \
                     -srcfolder /path/to/folder \
    Enter a new password to secure "mEncrypted.dmg":
    Re-enter new password:
    ....
    created: /Users/marslo/Desktop/mEncrypted.dmg
    
    # create read/write image with specific size
    $ hdiutil create ~/Desktop/mTest.dmg \
              -volname "Marslo Test" \
              -srcfolder ~/Desktop/mTest \
              -size 1g \
              -format UDRW                     # UDRW: read/write image
    
    hdiutil create image
    1.8.6.24 -- hdiutil create image
    hdiutil create encrypted image
    1.8.6.25 -- hdiutil create encrypted image
  • via create-dmg

    $ brew install create-dmg
    $ create-dmg --volname 'Python3 IDLE' \
                 --volicon /opt/dmg-backgound/.idle.icns \
                 --background /opt/dmg-backgound/.background.2.png \
                 --icon 'Python3 IDLE.app' 225 275 \
                 --app-drop-link 525 270 \
                 --window-size 750 500 \
                 --hide-extension 'Python3 IDLE.app' \
                 'Python3 IDLE.dmg' '/Applications/Python3 IDLE.app'
    
    create-dmg
    1.8.6.26 -- create-dmg

create dvd (for .iso, .img, .dmg)

$ hdiutil burn /path/to/image_file

create dmg for OS installer

$ sudo hdiutil create ~/Desktop/Lion.dmg -srcdevice /dev/disk2s4

resize the disk image

$ hdiutil resize -size <new size> <imagename>.dmg

# or
$ hdiutil resize -size 2g mEncrypted.dmg

restore disk images

$ sudo asr restore --source <disk image>.dmg --target /Volumes/<volume name>

extract

disk

list disks and volumes

$ diskutil list

# or
$ diskutil list disk1

# or via `lsblk`: https://command-not-found.com/lsblk
$ docker run cmd.cat/lsblk lsblk
NAME   MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
vda    254:0    0  16G  0 disk
└─vda1 254:1    0  16G  0 part /etc/hosts

# or via `lshw`: https://command-not-found.com/lshw
$ docker run cmd.cat/lshw lshw -class disk
  *-virtio1
       description: Virtual I/O device
       physical id: 0
       bus info: virtio@1
       logical name: vda
       configuration: driver=virtio_blk

# or
$ system_profiler SPStorageDataType

check volume info

$ diskutil info <path/to/volumn>
# i.e.:
$ diskutil info /Volumes/iMarsloOSX/
   Device Identifier:         disk1s5
   Device Node:               /dev/disk1s5
   Whole:                     No
   Part of Whole:             disk1

   Volume Name:               iMarsloOSX
   Mounted:                   Yes
   Mount Point:               /

list the apfs info

$ diskutil apfs list
APFS Container (1 found)
|
+-- Container disk1 ********-****-****-****-************
    ====================================================
    APFS Container Reference:     disk1
    Size (Capacity Ceiling):      250685575168 B (250.7 GB)
    Capacity In Use By Volumes:   176258826240 B (176.3 GB) (70.3% used)
    Capacity Not Allocated:       74426748928 B (74.4 GB) (29.7% free)
    |
    +-< Physical Store...>
    |
    +-> ...

$ diskutil apfs list
APFS Containers (3 found)
|
+-- Container disk3 8FD21D62-C7F0-4554-B7C7-AE85BE52D8AA
    ====================================================
    APFS Container Reference:     disk3
    Size (Capacity Ceiling):      494384795648 B (494.4 GB)
    Capacity In Use By Volumes:   289735741440 B (289.7 GB) (58.6% used)
    Capacity Not Allocated:       204649054208 B (204.6 GB) (41.4% free)
    |
    +-< Physical Store disk0s2 1*******-****-****-****-***********8
    |   -----------------------------------------------------------
    |   APFS Physical Store Disk:   disk0s2
    |   Size:                       494384795648 B (494.4 GB)
    |
    +-> Volume disk3s1 2*******-****-****-****-***********E
        ---------------------------------------------------
        APFS Volume Disk (Role):   disk3s1 (Data)
        Name:                      Macintosh HD - Data (Case-insensitive)
        Mount Point:               /System/Volumes/Data
        Capacity Consumed:         256742236160 B (256.7 GB)
        Sealed:                    No
        FileVault:                 Yes (Unlocked)

create volume for case-sensitive APFS

[!NOTE]

  • volume name: CaseSensitive
  • volume size: 4000m (4GB)
  • disk identifier: disk3
  • case-sensitive:
CASE SENSITIVE CASE INSENSITIVE
APFSX APFS
# for case-sensitive APFS
$ diskutil apfs addVolume disk3 APFSX CaseSensitive -quota 4000m

# remove
$ diskutil unmount /Volumes/CaseSensitive
$ diskutil apfs deleteVolume disk3s7

erase disk

File System Abbreviation
Mac OS Extended (Journaled) JHFS+
Mac OS Extended HFS+
MS-DOS fat32 FAT32
ExFAT ExFAT

  • to list file systems

    $ diskutil listFilesystems
    ...
    -------------------------------------------------------------------------------
    PERSONALITY                     USER VISIBLE NAME
    -------------------------------------------------------------------------------
    Case-sensitive APFS             APFS (Case-sensitive)
      (or) APFSX
    APFS                            APFS
      (or) APFSI
    ExFAT                           ExFAT
    Free Space                      Free Space
      (or) FREE
    MS-DOS                          MS-DOS (FAT)
    MS-DOS FAT12                    MS-DOS (FAT12)
    MS-DOS FAT16                    MS-DOS (FAT16)
    MS-DOS FAT32                    MS-DOS (FAT32)
      (or) FAT32
    HFS+                            Mac OS Extended
    Case-sensitive HFS+             Mac OS Extended (Case-sensitive)
      (or) HFSX
    Case-sensitive Journaled HFS+   Mac OS Extended (Case-sensitive, Journaled)
      (or) JHFSX
    Journaled HFS+                  Mac OS Extended (Journaled)
      (or) JHFS+
    UFSD_NTFS                       Microsoft NTFS
    
    ExFAT
    $ diskutil eraseDisk ExFAT iMarsloUSB /dev/disk2
    Started erase on disk2
    Unmounting disk
    Creating the partition map
    Waiting for partitions to activate
    Formatting disk2s2 as ExFAT with name iMarsloUSB
    Volume name      : iMarsloUSB
    Partition offset : 411648 sectors (210763776 bytes)
    Volume size      : 246534144 sectors (126225481728 bytes)
    Bytes per sector : 512
    Bytes per cluster: 131072
    FAT offset       : 2048 sectors (1048576 bytes)
    # FAT sectors    : 8192
    Number of FATs   : 1
    Cluster offset   : 10240 sectors (5242880 bytes)
    # Clusters       : 962984
    Volume Serial #  : 5ff81490
    Bitmap start     : 2
    Bitmap file size : 120373
    Upcase start     : 3
    Upcase file size : 5836
    Root start       : 4
    Mounting disk
    Finished erase on disk2
    
    check
    $ diskutil info disk2s1
       Device Identifier:         disk2s1
       Device Node:               /dev/disk2s1
       Whole:                     No
       Part of Whole:             disk2
    
       Volume Name:               EFI
       Mounted:                   No
    
       Partition Type:            EFI
       File System Personality:   MS-DOS FAT32
       Type (Bundle):             msdos
       Name (User Visible):       MS-DOS (FAT32)
       ...
       ...
    
    $ diskutil info disk2s2
       Device Identifier:         disk2s2
       Device Node:               /dev/disk2s2
       Whole:                     No
       Part of Whole:             disk2
    
       Volume Name:               iMarsloUSB
       Mounted:                   Yes
       Mount Point:               /Volumes/iMarsloUSB
    
       Partition Type:            Microsoft Basic Data
       File System Personality:   ExFAT
       Type (Bundle):             exfat
       Name (User Visible):       ExFAT
       ...
       ...
    
verifying and repairing volumes
$ diskutil verifyVolume /Volumes/<volume name>
$ diskutil repairVolume /Volumes/<volume name>

rename volume

$ diskutil rename "<current name of volume>" "<new name>"

partitioning a disk

reference:

  • GPT: GUID Partition Table
  • APM: Apple Partition Map
  • MBR: Master Boot Records

$ diskutil partitionDisk /dev/disk2 GPT JHFS+ New 0b
  • multiple partitions

    $ diskutil partitionDisk /dev/disk2 GPT \
               JHFS+ First 10g \
               JHFS+ Second 10g \
               JHFS+ Third 10g \
               JHFS+ Fourth 10g \
               JHFS+ Fifth 0b
    
  • splitting partitions

    $ diskutil splitPartition /dev/disk2s6 \
               JHFS+ Test 10GB \
               JHFS+ Test2 0b
    
  • merging partitions

    $ diskutil mergePartitions \
               JHFS+ \
               NewName \
               <first disk identifier in range> \
               <last disk identifier in range>
    # i.e.:
    $ diskutil mergePartitions JHFS+ NewName disk2s4 disk2s6
    

check usb

[!NOTE|label:references:]

$ system_profiler SPUSBDataType

# get xml format
$ system_profiler -xml SPUSBDataType

# or
$ ioreg -p IOUSB

# or
$ ioreg -p IOUSB -w0 -l

# or get device name
$ ioreg -p IOUSB -w0 | sed 's/[^o]*o //; s/@.*$//' | grep -v '^Root.*'

modify font in plist

[!NOTE|label:references:]

# check
$ /usr/libexec/PlistBuddy -c 'print ":/groovy/console/ui/:fontSize"' ~/Library/Preferences/groovy.console.ui.plist
18

# change
$ /usr/libexec/PlistBuddy -c 'Set ":/groovy/console/ui/:fontSize" 24' ~/Library/Preferences/groovy.console.ui.plist
$ /usr/libexec/PlistBuddy -c 'Print ":/groovy/console/ui/:fontSize"'  ~/Library/Preferences/groovy.console.ui.plist
24
original
$ defaults read ~/Library/Preferences/groovy.console.ui.plist
{
    "/groovy/console/ui/" =     {
        autoClearOutput = true;
        compilerPhase = 4;
        currentFileChooserDir = "/Users/marslo/Desktop";
        decompiledFontSize = 12;
        fontSize = 18;
        frameHeight = 600;
        frameWidth = 800;
        frameX = 198;
        frameY = 201;
        horizontalSplitterLocation = 100;
        inputAreaHeight = 576;
        inputAreaWidth = 1622;
        outputAreaHeight = 354;
        outputAreaWidth = 1676;
        showClosureClasses = false;
        showIndyBytecode = false;
        showScriptClass = true;
        showScriptFreeForm = false;
        showScriptInOutput = false;
        showTreeView = true;
        threadInterrupt = true;
        verticalSplitterLocation = 100;
    };
}

show process details

activity monitor
1.8.6.27 -- activity monitor

/usr/bin/xattr

[!NOTE|label:references:]

  • init

    $ touch test.txt
    $ /usr/bin/xattr -l test.txt
    
  • create attributes

    $ /usr/bin/xattr -w com.example.color blue test.txt
    $ /usr/bin/xattr -l test.txt
    com.example.color: blue
    
  • print attributes

    $ /usr/bin/xattr -p com.example.color test.txt
    blue
    
  • clear attributes

    $ /usr/bin/xattr -d com.example.color test.txt
    
    # or
    $ /usr/bin/xattr -c test.txt
    

hammerspoon

[!NOTE|label:references:]

to show debug info

-- ~/.hammerspoon/init.lua
local function logFocused()
  local app = hs.application.get("Cursor")
  if not app then print("Cursor not running"); return end
  local focused = hs.axuielement.applicationElement(app):attributeValue("AXFocusedUIElement")
  if not focused then print("no focused element"); return end
  print("=== focused element ===")
  print("role:        " .. (focused:attributeValue("AXRole")            or "nil"))
  print("subrole:     " .. (focused:attributeValue("AXSubrole")         or "nil"))
  print("description: " .. (focused:attributeValue("AXRoleDescription") or "nil"))
  print("title:       " .. (focused:attributeValue("AXTitle")           or "nil"))
  print("identifier:  " .. (focused:attributeValue("AXIdentifier")      or "nil"))
  print("label:       " .. (focused:attributeValue("AXLabel")           or "nil"))
  print("=======================")
end

-- ctrl + F1: log focused element
hs.hotkey.bind({"ctrl"}, "f1", logFocused)

switch input method in cursor/vscode

local MACIME  = "/opt/homebrew/bin/macime"
local ENGLISH = "com.apple.keylayout.US"

-- brew tap riodelphino/tap && brew install macime
local function switchToEnglish()
  hs.execute(MACIME .. " set " .. ENGLISH)
end

local function getFocusedDescription(app)
  local el = hs.axuielement.applicationElement(app):attributeValue("AXFocusedUIElement")
  if not el then return nil end
  return el:attributeValue("AXRoleDescription")
end

-- watch focus changes within Cursor
local observer

local function startObserver()
  local app = hs.application.get("Cursor")
  if not app then return end

  local axApp = hs.axuielement.applicationElement(app)
  observer = hs.axuielement.observer.new(app:pid())
  observer:addWatcher(axApp, "AXFocusedUIElementChanged")
  observer:callback(function()
    local a = hs.application.get("Cursor")
    if not a then return end
    local desc = getFocusedDescription(a)
    if desc == "editor" then
      switchToEnglish()
    end
  end)
  observer:start()
end

-- start observer when Cursor launches or is activated
hs.application.watcher.new(function(name, event, _)
  if name ~= "Cursor" then return end
  if event == hs.application.watcher.launched
  or event == hs.application.watcher.activated then
    startObserver()
  end
  if event == hs.application.watcher.terminated then
    if observer then observer:stop(); observer = nil end
  end
end):start()

-- handle already-running Cursor
startObserver()

tips

shutdown mac via commands

$ osascript -e 'tell app 'loginwindow' to «event aevtrsdn»'

alert on mac when server is up

$ ping -o -i 30 HOSTNAME && osascript -e 'tell app "Terminal" to display dialog "Server is up" buttons "It?s about time" default button 1'

turn off the screen without sleeping

$ pmset displaysleepnow

# sleep
$ pmset sleepnow

# lock
$ pmset lock

disable startup music

$ sudo nvram SystemAudioVolume=" "

3D lock screen

$ /System/Library/CoreServices/Menu\ Extras/User.menu/Contents/Resources/CGSession -suspend

take screenshot after 3 sec

$ screencapture -T 3 -t jpg -P delayedpic.jpg

setup welcome text in login screen

$ sudo defaults write /Library/Preferences/com.apple.loginwindow LoginwindowText 'Awesome Marslo!!'

show message on desktop

$ sudo jamf displayMessage -message "Hello World!"

launch iOS simulator

$ xcrun simctl list
$ open -a Simulator --args -CurrentDeviceUDID <DEVICE-UDID>
  • install the application on the device

    $ xcrun simctl install <DEVICE-UDID> <path to application bundle>
    $ xcrun simctl launch <DEVICE-UDID> <app bundle identifier>
    
    # or
    $ open -a Simulator.app
    
    # or
    $ open /Applications/Xcode.app/Contents/Developer/Applications/Simulator.app
    

show startup launch apps

$ launchctl list

check detail diskage usage

$ sudo fs_usage
21:03:47  ioctl        0.000003   iTerm2
21:03:47  ioctl        0.000003   iTerm2
21:03:47  close        0.000031   privoxy
21:03:47  select       0.000004   privoxy
...

notch

[!TIP|label:references:]

reduce the menu bar item spacing

  • read status

    $ defaults -currentHost read -globalDomain NSStatusItemSpacing
    $ defaults -currentHost read -globalDomain NSStatusItemSelectionPadding
    
  • setup spacing

    $ defaults -currentHost write -globalDomain NSStatusItemSpacing -int 12
    $ defaults -currentHost write -globalDomain NSStatusItemSelectionPadding -int 8
    $ killall SystemUIServer
    
  • revert

    $ defaults -currentHost delete -globalDomain NSStatusItemSpacing
    $ defaults -currentHost delete -globalDomain NSStatusItemSelectionPadding
    $ killall SystemUIServer
    
Copyright © marslo 2020-2025 all right reserved,powered by GitbookLast Modified: 2026-05-14 13:01:00

results matching ""

    No results matching ""