tricky

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

  • Automator -> Quick Action

  • 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

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

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:.
    $ 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/
$ 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.

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
  • 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
  • more:

    • Info.plist

      <?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>
      <?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

enable Technical Symbols

and snippets

  • go to System Preferences ⇢ Keyboard ⇢ Test

finally

others

$ 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
  • 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 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 SystemAbbreviation

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

<!--endsec-->

<!--sec data-title="check" data-id="section5" data-show=true data-collapse=true ces-->
```bash
$ 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
$ 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

/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»'

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

$ 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!"

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

Last updated