Menu

Mac (Mojave) - cannot find Tesseract or Tessdata. Please enter its name in Settings

Help
2021-01-23
2021-01-27
1 2 > >> (Page 1 of 2)
  • Gary Gauthier

    Gary Gauthier - 2021-01-23

    I installed the MacPorts version of Tesseract 4.1.1 on Mojave (macOS v10.14.6) and set up the environment variables to allow running tesseract from the command prompt. I also set the $TESSDATA_PREFIX to "/opt/local/share/tessdata" which is the parent directory of my "traineddata" directory. ( Tesseract installation puts a few other files in the parent directory). I can run tesseract from the command line. I can also have it list the installed traineddata files. So; it and the environment variables are working.

    Here is what Tesseract provides in response to the version switch:
    $ tesseract --version
    tesseract 4.1.1
    leptonica-1.80.0
    libjpeg 8d (libjpeg-turbo 2.0.6) : libpng 1.6.37 : libtiff 4.2.0 : zlib 1.2.11 : libwebp 1.1.0 : libopenjp2 2.3.1
    Found AVX
    Found SSE

    However; it seems that VietOCR v5.7.2 does not see the environment variables, as it gives a message about, "cannot find Tesseract or Tessdata. Please enter its name in Settings." Furthermore; I can see no option in the settings in which to enter the info per the error message.

    The version of Java that I have installed appears to be OK, since I can load images and enlarge/reduce them.

    What could be the issue?

     
  • Gary Gauthier

    Gary Gauthier - 2021-01-23

    I should also note that the installation with MacPorts already created the symbolic link that vectors a request for libtesseract.dylib to /opt/local/lib/libtesseract.4.dylib

     
  • Quan Nguyen

    Quan Nguyen - 2021-01-23

    Hi Gary,

    Can you check Issue 194 to see if it helps?

    Thanks,
    Quan

     
  • Gary Gauthier

    Gary Gauthier - 2021-01-24

    Hi Quan;

    I'm not a Java wizard, but it I do believe that the issue of Apple "tightening" system security is relevant to why the GUI is not working.

    On the current O/S Mojave, there is no "/lib" in "/usr/local" and nothing can be added or changed in the "/usr" directory. Apple has prevented access to it. It seems that user-added files now must be placed in the "/opt" directory structure instead. The file libtesseract.4.dylib and the symlink to it, "/opt/local/lib/libtesseract.dylib", are both located in "/opt/local/lib". One can see evidence that other user-installed libraries are also present in that /opt directory structure. I assume that "opt" stands for optional...typical of Apple.

    Any ideas how to get around this?

     

    Last edit: Gary Gauthier 2021-01-24
  • Quan Nguyen

    Quan Nguyen - 2021-01-24

    VietOCR uses Tess4J wrapper, which in turn uses JNA library to search and load native libraries. The program is looking for a libtesseract.dylib, which you have but may not be in the paths that it looks for.

    But there's a workaround. You can specify the paths JNA is searching for the native libraries by setting a property at the command line. So please open a terminal and try with this command option:

    java -Djna.library.path=/opt/local/lib/ -jar VietOCR.jar

    or

    java -Djna.library.path=/opt/local/lib/ -Xms128m -Xmx2048m -jar VietOCR.jar

    if you want to provide more RAM to the program.

     

    Last edit: Quan Nguyen 2021-01-24
  • Gary Gauthier

    Gary Gauthier - 2021-01-24

    That worked. Thank you so much, Quan!
    Just need to get scanning and spell-checking working.
    I thought scanning was built-in, but seems there must be something missing.
    As for spell-checking, I need to find the components I need to install.
    Is there anything that covers those two issues?

     
  • Quan Nguyen

    Quan Nguyen - 2021-01-24

    For spellcheck, you'd need to install Hunspell.

    http://pankdm.github.io/hunspell.html

    For scanning, only Windows and Linux 32-bit are supported. If someone can develop a solution for MacOS....

     
  • Gary Gauthier

    Gary Gauthier - 2021-01-24

    Quan;
    I'm still working on getting the scanning functioning. Installing SANE on a Mac for my Epson scanner is a bit dfficult. I've contacted the author for help.

    I wasn't able to use the instructions on the noted page for "hunspell"., since I use MacPorts.
    I installed hunspell 1.70 and the dictionaries, plus checked that hunspell could list them using the "-D" option at the command prompt. That worked.

    Then I went to VietOCR and tried to initiate a spell-check. It returned the error, "Spellcheck initialization error!". I really don't know what VietOCR was trying to do, so am not sure how to proceed. I suspect that it couldn't initiate ite for some reason.

    Here is a bit of the error stream which may help you in determining what VietOCR was trying to find:

    java.lang.Exception: Spellcheck initialization error!
    at net.sourceforge.vietpad.utilities.SpellCheckHelper.enableSpellCheck(Unknown Source)
    at net.sourceforge.vietocr.GuiWithSpellcheck.jToggleButtonSpellCheckActionPerformed(Unknown Source)
    at net.sourceforge.vietocr.Gui$42.actionPerformed(Unknown Source)

     
  • Gary Gauthier

    Gary Gauthier - 2021-01-24

    Ok. A bit of headway. I noticed that the hunspell 1.70 installed libhunspell-1.7.a in /opt/local/lib. So, I made a symbolic link called libhunspell.a that pointed to it. However; I still getting the same error, as if VietOCR doesn't find it and needs a commandline switch.

    By the way the MacPort version of hunspell was packaged as hunspell-1.7.0_1.darwin_18.x86_64.tbz2, which impies that it was made for the mac and 64-bit operation. Is that the issue?

     
  • Quan Nguyen

    Quan Nguyen - 2021-01-24

    JNA is looking for .dylib on MacOS. You may want to try a symbolic link with that extension.

     
  • Gary Gauthier

    Gary Gauthier - 2021-01-25

    Quan;
    I got rid of the previously noted symlink and created a libhunspell.dylib one that links to libhunspell-1.7.0.dylib in the same /opt/local/lib directory. Unfortunately it still doesn't seem to find it. Perhaps VietOCR doesn't know to look for the libhunspell.dylib in /opt/local/lib? I'm not sure how Java knows where to look. Should "/opt/local/lib" be added to the profile?

    My .profile file is currently set as:

    # MacPorts Installer addition on 2021-01-22_at_15:09:56: adding an appropriate PATH variable for use with MacPorts.
    export PATH="/opt/local/bin:/opt/local/sbin:$PATH"
    # Finished adapting your PATH environment variable for use with MacPorts.
    # Added TESSDATA_PREFIX
    export TESSDATA_PREFIX="/opt/local/share/tesseract-ocr/4.00"
    
     
  • Gary Gauthier

    Gary Gauthier - 2021-01-25

    Actually; I did a bit or digging and found that I've already told VietOCR to look in the "/opt/local/lib/" directory, because I invoke it with "java -Djna.library.path=/opt/local/lib/ -Xms128m -Xmx2048m -jar /Applications/VietOCR3/VietOCR.jar". So it really should be finding the symlink and invoking the correct .dylib file.

     

    Last edit: Gary Gauthier 2021-01-25
  • Quan Nguyen

    Quan Nguyen - 2021-01-25

    .a is static library. JNA requires dynamic library .dylib version. You may have to build Hunspell from the source.

     
  • Gary Gauthier

    Gary Gauthier - 2021-01-26

    Hi Quan;

    Ok. I found that since I have LibreOffice/NeoOffice installed (which uses hunspell), the dynamic hunspell library was already in the /usr/lib directory. So I created a symlink (libhunspell.dylib) in the /opt/local/lib directory that points to /usr/lib/libhunspell-1.2.0.0.0.dylib That should work, since the symlink is on the specified library path when starting VietOCR.

    Because LibreOffice/NeoOffice installed, the dictionaries are in both the VietOCR/dict directory as well as in /Users/[user-name]/Library/Spelling Not sure if that is an issue for VietOCR, but my LibreOffice/NeoOffice spell-checking still works fine.

    Unfortunately; VietOCR now gives a "Spellcheck initialization error!"

    [Are there other hunspell-related dependencies that I need to examine? Perhaps the dictionary files from VietOCR are not in the correct format for a Mac and it's not seeing the ones from LibreOffice/NeoOffice? Would copying the dictionary files from LibreOffice/NeoOffice to the VietOCR directory be something to try?]

    It's not all gloomy... I tried VietOCR on some rather poor images of typewritten World War 1 war-diaries and got well over 90% of it correct with nothing more than deskewing the images! If you'd seen the originals, you'd say it was amazing.

     
  • Quan Nguyen

    Quan Nguyen - 2021-01-26

    Hi Gary,

    The integrated JNA Hunspell wrapper works with Hunspell 1.7 -- it was verified working on Windows and Linux Ubuntu 20.10. Your version seems too old, and probably is not compatible. I wonder why the Hunspell version bundled with LibreOffice is so outdated. Is it because of outdated LibreOffice itself?

     
  • Gary Gauthier

    Gary Gauthier - 2021-01-26

    Quan;

    I put things back to invoking the dylib labelled v1.7, but when I ran the hunspell executable to check the correct version was running it came up with;

    @(#) International Ispell Version 3.2.06 (but really Hunspell 1.7.0)
    

    Sounds like Macports doesn't actually install a true version 1.7.
    Could you tell me what your system says in response to the "hunspell -v" command?
    I may have to re-install hunspell.

     

    Last edit: Gary Gauthier 2021-01-26
  • Gary Gauthier

    Gary Gauthier - 2021-01-26

    Sorry to bother you further Quan.
    I thought to have a look at the nature of the spellcheck error that came up in the console window.

    Jan 26, 2021 10:00:20 AM net.sourceforge.vietocr.GuiWithSpellcheck jToggleButtonSpellCheckActionPerformed
    WARNING: Spellcheck initialization error!
    java.lang.Exception: Spellcheck initialization error!
        at net.sourceforge.vietpad.utilities.SpellCheckHelper.enableSpellCheck(Unknown Source)
        at net.sourceforge.vietocr.GuiWithSpellcheck.jToggleButtonSpellCheckActionPerformed(Unknown Source)
        at net.sourceforge.vietocr.Gui$42.actionPerformed(Unknown Source)
    

    It looks as the exception is triggered by this code:

    spellDict = Hunspell.getInstance().getDictionary(new File(baseDir, "dict/" + localeId).getPath());
                loadUserDictionary();
    

    That seems to indicate that its throwing an exception because it can't find the user dictionaries in the VietOCR "dict/" directory, not because of an error in running hunspell. However; the dictionaries are in the correct VietOCR directory. That means that perhaps VietOCR can't establish its "baseDir". I'm not sure of the details of how it does that. Perhaps VietOCR needs to be in the PATH or in a particular directory on a Mac?

     
  • Gary Gauthier

    Gary Gauthier - 2021-01-27

    Thanks for following up on this. I just ran the new test-version, but got a different exception.
    Looks like it got further though.

    Not sure, but there could be a simple typo in the target library name in the code. Here is the console window output.

    Last login: Tue Jan 26 17:20:31 on ttys000
    /Users/garygauthier/VietOCR3/VietOCR.sh ; exit;
    Garys-MacBook-Pro:~ garygauthier$ /Users/garygauthier/VietOCR3/VietOCR.sh ; exit;
    Warning: Invalid resolution 0 dpi. Using 70 instead.
    Estimating resolution as 246
    Exception in thread "AWT-EventQueue-0" java.lang.UnsatisfiedLinkError: Can't find **liblibhunspell.dylib** in the filesystem nor in the classpath
    java.lang.UnsatisfiedLinkError: Unable to load library 'libhunspell':
    dlopen(liblibhunspell.dylib, 9): image not found
    dlopen(liblibhunspell.dylib, 9): image not found
    dlopen(/Users/garygauthier/Library/Frameworks/libhunspell.framework/libhunspell, 9): image not found
    dlopen(/Library/Frameworks/libhunspell.framework/libhunspell, 9): image not found
    dlopen(/System/Library/Frameworks/libhunspell.framework/libhunspell, 9): image not found
    Native library (darwin/liblibhunspell.dylib) not found in resource path ([file:/Users/garygauthier/VietOCR3/VietOCR.jar])
        at com.stibocatalog.hunspell.Hunspell.<init>(Unknown Source)
        at com.stibocatalog.hunspell.Hunspell.getInstance(Unknown Source)
        at com.stibocatalog.hunspell.Hunspell.getInstance(Unknown Source)
        at net.sourceforge.vietpad.utilities.SpellCheckHelper.initializeSpellCheck(Unknown Source)
        at net.sourceforge.vietpad.utilities.SpellCheckHelper.enableSpellCheck(Unknown Source)
        at net.sourceforge.vietocr.GuiWithSpellcheck.jToggleButtonSpellCheckActionPerformed(Unknown Source)
        at net.sourceforge.vietocr.Gui$42.actionPerformed(Unknown Source)
        at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2022)
        at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2348)
        at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:402)
        at javax.swing.JToggleButton$ToggleButtonModel.setPressed(JToggleButton.java:308)
        at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:252)
        at java.awt.AWTEventMulticaster.mouseReleased(AWTEventMulticaster.java:289)
        at java.awt.Component.processMouseEvent(Component.java:6539)
        at javax.swing.JComponent.processMouseEvent(JComponent.java:3324)
        at java.awt.Component.processEvent(Component.java:6304)
        at java.awt.Container.processEvent(Container.java:2239)
        at java.awt.Component.dispatchEventImpl(Component.java:4889)
        at java.awt.Container.dispatchEventImpl(Container.java:2297)
        at java.awt.Component.dispatchEvent(Component.java:4711)
        at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4904)
        at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4535)
        at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4476)
        at java.awt.Container.dispatchEventImpl(Container.java:2283)
        at java.awt.Window.dispatchEventImpl(Window.java:2746)
        at java.awt.Component.dispatchEvent(Component.java:4711)
        at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:760)
        at java.awt.EventQueue.access$500(EventQueue.java:97)
        at java.awt.EventQueue$3.run(EventQueue.java:709)
        at java.awt.EventQueue$3.run(EventQueue.java:703)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:74)
        at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:84)
        at java.awt.EventQueue$4.run(EventQueue.java:733)
        at java.awt.EventQueue$4.run(EventQueue.java:731)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:74)
        at java.awt.EventQueue.dispatchEvent(EventQueue.java:730)
        at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:205)
        at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116)
        at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93)
        at java.awt.EventDispatchThread.run(EventDispatchThread.java:82)
    
     
  • Quan Nguyen

    Quan Nguyen - 2021-01-27

    Sorry, incorrect libname. Please try this version.

     
  • Gary Gauthier

    Gary Gauthier - 2021-01-27

    Quan;

    This version gets further, but seems to have an issue. I've verified that 'libhunspell.dylib' is present as a symlink in '/opt/local/lib' and points to '/opt/local/lib/libhunspell-1.7.0.dylib'. I've checked that that 'hunspell' itself works from the command line.

    So I'm not quite sure what to make of the following console message. Is this due to VietOCR expecting hunspell to be 32-bit and finding a 64-bit library? (If so, this could also be the same issue that is haunting the scanner extension. Many ports these days automatically compile for 64-bit, as that is the direction that the O'S's are going.)

    Last login: Wed Jan 27 06:19:47 on ttys000
    /Users/garygauthier/VietOCR3/VietOCR.sh ; exit;
    Garys-MacBook-Pro:~ garygauthier$ /Users/garygauthier/VietOCR3/VietOCR.sh ; exit;
    Warning: Invalid resolution 0 dpi. Using 70 instead.
    Estimating resolution as 246
    Exception in thread "AWT-EventQueue-0" java.lang.UnsatisfiedLinkError: Can't find libhunspell.dylib in the filesystem nor in the classpath
    java.lang.UnsatisfiedLinkError: Unable to load library 'hunspell':
    dlopen(/opt/local/lib/libhunspell.dylib, 9): no suitable image found.  Did find:
        /opt/local/lib/libhunspell.dylib: file too short
        /opt/local/lib/libhunspell.dylib: file too short
    dlopen(/opt/local/lib/libhunspell.dylib, 9): no suitable image found.  Did find:
        /opt/local/lib/libhunspell.dylib: file too short
        /opt/local/lib/libhunspell.dylib: file too short
    dlopen(/Users/garygauthier/Library/Frameworks/hunspell.framework/hunspell, 9): image not found
    dlopen(/Library/Frameworks/hunspell.framework/hunspell, 9): image not found
    dlopen(/System/Library/Frameworks/hunspell.framework/hunspell, 9): image not found
    Native library (darwin/libhunspell.dylib) not found in resource path ([file:/Users/garygauthier/VietOCR3/VietOCR.jar])
        at com.stibocatalog.hunspell.Hunspell.<init>(Unknown Source)
        at com.stibocatalog.hunspell.Hunspell.getInstance(Unknown Source)
        at com.stibocatalog.hunspell.Hunspell.getInstance(Unknown Source)
        at net.sourceforge.vietpad.utilities.SpellCheckHelper.initializeSpellCheck(Unknown Source)
        at net.sourceforge.vietpad.utilities.SpellCheckHelper.enableSpellCheck(Unknown Source)
        at net.sourceforge.vietocr.GuiWithSpellcheck.jToggleButtonSpellCheckActionPerformed(Unknown Source)
        at net.sourceforge.vietocr.Gui$42.actionPerformed(Unknown Source)
        at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2022)
        at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2348)
        at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:402)
        at javax.swing.JToggleButton$ToggleButtonModel.setPressed(JToggleButton.java:308)
        at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:252)
        at java.awt.AWTEventMulticaster.mouseReleased(AWTEventMulticaster.java:289)
        at java.awt.Component.processMouseEvent(Component.java:6539)
        at javax.swing.JComponent.processMouseEvent(JComponent.java:3324)
        at java.awt.Component.processEvent(Component.java:6304)
        at java.awt.Container.processEvent(Container.java:2239)
        at java.awt.Component.dispatchEventImpl(Component.java:4889)
        at java.awt.Container.dispatchEventImpl(Container.java:2297)
        at java.awt.Component.dispatchEvent(Component.java:4711)
        at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4904)
        at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4535)
        at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4476)
        at java.awt.Container.dispatchEventImpl(Container.java:2283)
        at java.awt.Window.dispatchEventImpl(Window.java:2746)
        at java.awt.Component.dispatchEvent(Component.java:4711)
        at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:760)
        at java.awt.EventQueue.access$500(EventQueue.java:97)
        at java.awt.EventQueue$3.run(EventQueue.java:709)
        at java.awt.EventQueue$3.run(EventQueue.java:703)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:74)
        at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:84)
        at java.awt.EventQueue$4.run(EventQueue.java:733)
        at java.awt.EventQueue$4.run(EventQueue.java:731)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:74)
        at java.awt.EventQueue.dispatchEvent(EventQueue.java:730)
        at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:205)
        at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116)
        at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93)
        at java.awt.EventDispatchThread.run(EventDispatchThread.java:82)
    
     

    Last edit: Gary Gauthier 2021-01-27
  • Quan Nguyen

    Quan Nguyen - 2021-01-27

    Web searching for "/opt/local/lib/libhunspell.dylib: file too short" and the general concensus was the symbolic link might get corrupted. You may want to delete and recreate it.

     
  • Gary Gauthier

    Gary Gauthier - 2021-01-27

    SUCCESS!!!!

    That worked perfectly and I can now correct errors in the OCR'd text.

    There's only one function left for me to debug and get working.
    Could I ask if the scan function requires 32-bit or will it run with a 64-bit SANE install?
    Of course; I'll also check the symlinks to make sure they're OK as well.

     

    Last edit: Gary Gauthier 2021-01-27
  • Gary Gauthier

    Gary Gauthier - 2021-01-27

    Quan;

    Re: Scanning functionality
    The SAN packages were installed from precompiled binaries (http://www.ellert.se/twain-sane/) supplied by Mattias Ellert. So it gets istalled in the regular usr directory structure. I decided to use his installation package, as it has a preference pane configuration applet, which leaves less room for error.

    I'm getting the following NullPointerException. Not sure what the isuue might be. Any ideas for me to follow up?

    Last login: Wed Jan 27 07:47:59 on ttys001
    Garys-MacBook-Pro:~ garygauthier$ /Users/garygauthier/VietOCR3/VietOCR.sh ; exit;
    Jan 27, 2021 8:01:59 AM net.sourceforge.vietocr.GuiWithScan$1 run
    SEVERE: null
    java.lang.NullPointerException
        at net.sourceforge.vietocr.GuiWithScan$1.run(Unknown Source)
        at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:311)
        at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:758)
        at java.awt.EventQueue.access$500(EventQueue.java:97)
        at java.awt.EventQueue$3.run(EventQueue.java:709)
        at java.awt.EventQueue$3.run(EventQueue.java:703)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:74)
        at java.awt.EventQueue.dispatchEvent(EventQueue.java:728)
        at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:205)
        at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116)
        at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93)
        at java.awt.EventDispatchThread.run(EventDispatchThread.java:82)
    
     
  • Gary Gauthier

    Gary Gauthier - 2021-01-27

    Quan;

    A bit more info about the SANE installation on a Mac. The 'scanimage', 'sane-find-scanner' and 'sane-config' executables are installed in '/usr/local/bin' by Mattias' install packages. The directory '/usr/local/bin' is in the PATH.

     
1 2 > >> (Page 1 of 2)

Log in to post a comment.