Welcome to my website. I am always posting links to photo albums, art, technology and other creations. Everything that you will see on my numerous personal sites is powered by the formVistaTM Website Management Engine.

icon.linkedin.jpgicon.twitter.jpg

  • Subscribe to this RSS Feed
  • Cloned VMware CentOS6 Server and "device eth0 does not seem to be present, delaying initialization" Error
    11/17/2011 3:31PM
    Recently, I cloned a vmware install of CentOS6 and after firing up the clone and trying to start networking received the error: "device eth0 does not seem to be present, delaying initialization"

    It turns out that the NIC on the cloned machine was being renamed and registered to eth1.

    To list the current ethn devices:

    # ls /sys/class/net
    eth1 lo

    There is a device manager, udev, which stores the settings from the NIC of the vm prior to the cloning process.  When you clone a vm it also changes the mac address of the NIC and as a result the vm sees it as a new NIC and assigns it to /dev/eth1.

    As a result, we now have to edit the udev config file as well as the ifcfg-eth0 file to get the newly update virtual NIC card to operate on the eth0 device.

    First, edit: /etc/udev/rules.d/70-persistent-net.rules

    # This file was automatically generated by the /lib/udev/write_net_rules
    # program, run by the persistent-net-generator.rules rules file.
    #
    # You can modify it, as long as you keep each rule on a single
    # line, and change only the value of the NAME= key.

    # PCI device 0x15ad:0x07b0 (vmxnet3) (custom name provided by external tool)
    SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="00:50:56:bc:00:45", ATTR{type}=="1", KERNEL=="eth*", NAME="eth0"

    # PCI device 0x15ad:0x07b0 (vmxnet3)
    SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="00:50:56:bc:00:46", ATTR{type}=="1", KERNEL=="eth*", NAME="eth1"


    Delete the first SUBSYSTEM entry in the file.

    Update the 'eth1' attribute in the remaining entry to 'eth0'

    Edit /etc/sysconfig/network-scripts/ifcfg-eth0

    . Change the HWADDR to match the new mac address listed in the newly edited 70-persistent-net.rules file.

    reboot.
  • Java: Capitalize the First Letter in a String
    11/14/2011 1:15PM

    A seemingly trivial task, but worth jotting down for future reference.

    String sourceString = "this is some string";
    String convertedString = String.format("%s%s", Character.toUpperCase(sourceString.charAt(0)), sourceString.substring(1));

  • Java: How To Use RandomAccessFile and FileChannel to Write to a Specific Location in a File
    10/06/2011 11:32AM

    If there is ever a need to write bytes to a specific location to an existing file, here is an example of how to use the RandomAccessFile and FileChannel Java classes to do so:

    import java.io.File;
    import java.io.FileNotFoundException;
    import java.io.IOException;
    import java.io.RandomAccessFile;
    import java.nio.ByteBuffer;
    import java.nio.channels.FileChannel;

    /**
     * Will write bytes to the beginning of an existing file.
     *
     * @author Ryan Chapin
     */
    public class RandomAccessFileTest {

        public static void main(String[] args) {

            // Generate input string and the ByteBuffer for it
            String stringToInsert = "This is a string to insert into a file.";
            byte[] answerByteArray = stringToInsert.getBytes();
            ByteBuffer byteBuffer = ByteBuffer.wrap(answerByteArray);

            File fileToModify = new File("/path/to/file");

            RandomAccessFile randomAccessFile = null;
            try {
                randomAccessFile = new RandomAccessFile(fileToModify, "rw");
            } catch (FileNotFoundException e1) {
                // TODO error handling and logging
            }

            FileChannel outputFileChannel = randomAccessFile.getChannel();

            // Move to the beginning of the file and write out the contents
            // of the byteBuffer.
            try {
                outputFileChannel.position(0);

                while(byteBuffer.hasRemaining()) {
                    outputFileChannel.write(byteBuffer);
                }
            } catch (IOException e) {
                // TODO error handling and logging
            }

            try {
                outputFileChannel.close();
            } catch (IOException e) {
                // TODO error handling and logging
            }

            try {
                randomAccessFile.close();
            } catch (IOException e) {
                // TODO error handling and logging
            }
        }
    }

  • Using a ProcessBuilder to Execute an OS Level Command and Properly Read the Exit Code from a Java Process
    10/06/2011 10:42AM

    There are many a situation where a developer will want to execute an OS level command in another process and read not only the standard out (stdout), and standard error (sterr), but also the exit code returned from the process.

    To do so, utilize the ProcessBuilder class along with a helper class (ProcessWrapper) that will provide the ability to set a timeout for the process and read the exit code in a separate thread.

    Following is an example and the ProcessWrapper class with an explaination:

    import java.io.IOException;

    public class ProcessBuilderTest {

        /**
         * Time in milliseconds that we will wait for the process to complete before
         * timing out and killing it.
         */
        private static final long fTimeout = 10000;

        public static void main(String[] args) {

            String[] commandArray = { "some", "command" };

            ProcessBuilder processBuilder = new ProcessBuilder(commandArray);

            Process process = null;
            try {
                process = processBuilder.start();
            } catch (IOException e) {
                // TODO: Error handling, logging
            }

            // --------------------------------------------------------------------
            // Read the exit code from the fProcess
            ProcessWrapper processWrapper = new ProcessWrapper(process);
            processWrapper.start();

            int exitCode = 0;
            try {
                processWrapper.join(fTimeout);

                // Check for an exit code from the process
                if (processWrapper.getfExitCode() != null) {
                    exitCode = processWrapper.getfExitCode();
                } else {
                    // Set our exit code to 1
                    exitCode = 1;
                    process.destroy();
                }
            } catch (InterruptedException e) {
                processWrapper.interrupt();
                Thread.currentThread().interrupt();
                process.destroy();
            }

            System.out.print("exitCode = " + exitCode);
        }

        public static class ProcessWrapper extends Thread {

            private final Process fProcess;

            private Integer fExitCode;

            public Integer getfExitCode() {
                return fExitCode;
            }

            public ProcessWrapper(Process fProcess) {
                this.fProcess = fProcess;
            }

            public void run() {
                try {
                    fExitCode = fProcess.waitFor();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    In the ProcessBuilderTest main() method the command to be executed is build in the commandArray String[].

    A ProcessBuilder instance is created and passed the command to execute. Then a Process instance providing a reference to the process running on the OS is instantiated via the ProcessBuilder.start() command.

    Here is where the wrapper class that helps us to read the exit code comes in. A ProcessWrapper is instantiated and passed a reference to the process on construction, and then the thread started with the .start() invocation.

    Then processWrapper.join(fTimeout) is invoked telling the current thread to wait for the completion of the processWrapper thread, or interrupt it (timeout) after the value of fTimeout (in this case 10 seconds).

    If the processWrapper thread completes before the timeout the main thread invokes processWrapper.getfExitCode(), to acquire the exit code from the process. If not, the process is killed and we pass an exitCode of 1 to indicate abnormal completion.

    Attached is a .zip of the java classes for reference and testing.

    Attachment: processbuildertest.zip 1308 bytes
  • Dynamically Instantiating Classes in Java
    09/16/2011 11:42AM

    There are a number of cases when you may not know exactly what class you will be instantiating and want to be able to dynamically instatiate specific classes based on a configuration file or a condition during runtime.

    To do so, you will need to define an Interface for your classes and can then use the following code as a guide:

    String className = args[0];
    String qualifiedClassName = null;
    Class instanceClass = null;

    try {
            qualifiedClassName = fClassPackage.getName() + "." + className;
            instanceClass = Class.forName(qualifiedClassName);
    } catch(ClassNotFoundException e) {
            e.printStackTrace();
    }

    Interface dynamicInstance = null;

    try {
            dynamicInstance = (Interface) instanceClass.newInstance();
    } catch(InstantiationException e) {
            e.printStackTrace();
    } catch (IllegalAccessException e) {
            e.printStackTrace();
    }

    // Set fields in new instance
    dynamicInstance.setSomething("foo");


    Keep in mind that dynamically instantiated classes must include a no argument constructor.  As a result, you will need to have mutator methods for each field that requires configuration in your class.


Advanced Search

Categories

Archives