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.7.6.1 -- option key
  • Automator -> Quick Action
create quick action
1.7.6.2 -- create quick action
content menu
1.7.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.7.6.4 -- copy path apple script
copy path shortcut key
1.7.6.5 -- copy path shortcut key

create app

[!NOTE|label:references:]

groovyConsole

[!NOTE|label:expection] case: run groovyConsole from Spolite 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 Applicaiton

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

    Automator.app » save to an app
    1.7.6.6 -- 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:.
    
$ 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.7.6.7 -- 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
    

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
    
    PYTHON_SHORT_VERSION=$(/usr/bin/sed -rn 's/^([^[0-9]+)([0-9]+\.[0-9]+).*$/\2/p' < <(/usr/local/bin/python3 --version) )
    /usr/bin/open "$(/usr/local/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.7.6.8 -- script in automator.app
  • icon

    $ PYTHON_SHORT_VERSION=$(/usr/local/opt/gnu-sed/libexec/gnubin/sed -rn 's/^([^[0-9]+)([0-9]+\.[0-9]+).*$/\2/p' < <(/usr/local/bin/python3 --version) )
    $ cp "$(/usr/local/bin/brew --prefix python@${PYTHON_SHORT_VERSION})"/IDLE\ 3.app/Contents/Resources/IDLE.icns IDLE.app/Contents/Resources/
    
    # modify IDLE.app/Contents/Info.plist
    <key>CFBundleIconFile</key>
    <string>IDLE</string>
    
    ## original
    <key>CFBundleIconFile</key>
    <string>ApplicationStub</string>
    
    • 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
    
    PYTHON_SHORT_VERSION=$(/usr/local/opt/gnu-sed/libexec/gnubin/sed -rn 's/^([^[0-9]+)([0-9]+\.[0-9]+).*$/\2/p' < <(/usr/local/bin/python3 --version) )
    /usr/bin/open "$(/usr/local/bin/brew --prefix python@${PYTHON_SHORT_VERSION})"/IDLE\ 3.app
    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.7.6.9 -- 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
      
    • 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

  • Open Customized ListTechnical Symbols customized list

    technical symbols
    1.7.6.10 -- technical symbols

and snippets

  • go to System PreferencesKeyboardTest
  • add snippets as below snippets

finally

test-1
1.7.6.11 -- test-1
test-2
1.7.6.12 -- test-2

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:]

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.7.6.13 -- hdiutil create image
    hdiutil create encrypted image
    1.7.6.14 -- 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.7.6.15 -- 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

check volumn 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 disks and volumns

    $ 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
    

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...>
    |
    +-> ...

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

$ 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.7.6.16 -- 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
    

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 <your device UDID>
  • install the application on the device
    $ xcrun simctl install <your device UDID> <path to application bundle>
    $ xcrun simctl launch <your 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-2024 all right reserved,powered by GitbookLast Modified: 2024-12-06 23:51:27

results matching ""

    No results matching ""