Thursday, January 31, 2008

enable password protected lighttpd folders

1. open /etc/lighttpd/lighttpd.conf
2. add "mod_auth to server.modules"
3. add this block of code right after. replace items in <> with desired value


auth.debug = 2
auth.backend = "plain"
auth.backend.plain.userfile = "/home/<username>/.lighttpdpassword"

auth.require = ( "/<web accessible domain to protect>/" =>
(
"method" => "basic",
"realm" => "Password protected area",
"require" => "user=<username>"
)


4. save configuration
5. create the password file ".lighttpdpassword" and append usernames and passwords

<username>:<password>
...

6. save and allow access to everyone chmod 777 .lighttpdpassword
7. restart lighthttpd with /etc/init.d/lighttpd restart

Wednesday, January 9, 2008

running executable jar files via console

Use when:
1. NoClassDefFoundError and MissingResourceExceptions keep appearing every time an executable jar file is run
2. executable jar files need 3rd party libraries
3. resource folders need to be accessible via classpath


There are two ways to run executable jar files. Which to use depends on how the jar file was constructed.

If the jar file does not need any 3rd party libraries use:

java -jar <jarfile>


If the jar file uses any 3rd party libraries that has not been put inside the archive or needs to have folders accessible via classpath, use:

java -cp .;<libraries>;<classpath>;<jarfile> <main-class>

*Note that a folder containing customized Properties files must appear before the main jar file to override any copies inside the archive itself


Tuesday, January 8, 2008

organize eclipse project folders

organize a project's source folders in such a way that:

  1. all source files are stored in the src folder
  2. all configuration files such as xml, properties, and conf files are stored in the conf folder
  3. all compiled classes are put in the bin folder
  4. exported jar file(s) are stored in the dist folder
  5. project specific configuration files (i.e. .jardesc, manifest.mf) are stored in the etc folder


==========
  1. right click Package Explorer and select New>Create a New Project
  2. select Java Project and click Next
  3. specify the project's name and make sure Create separate source and output folders is selected in the Project Layout panel
  4. click Next
  5. click the Create new source folder link and create the src and conf folders
  6. click Finish
  7. right click the project name and add the bin, dist, etc folders
  8. create a new manifest file in the etc folder and name it manifest.mf
  9. make sure ". conf" is part of the Class-path so that configuration files stored in it can be accessed by your classes

easily share eclipse user libraries (windows)

Use when:
1. working on a project on more that two computers (ie. work and home pc)
2. working on multiple projects that share common libraries
3. projects need to be easily passed around with minimal configuration
4. multiple developers are working on single project



========

  1. store all java libraries on a single folder. make sure each library is in its own folder.
  2. create a network share on this folder, and have it mapped to J: drive. if multiple machines are going to access the same set of libraries, have one of them act as a repository for the libraries and have the others map J: drive to it.
  3. in eclipse, goto Window>Preferences>Java>Build Path>User Libraries and create User Libraries for each entry in J:. no need to run steps 3-6 on all machines.
  4. click Export.
  5. click Select All and specify a filename for the .userlibraries file.
  6. click OK to export and save your settings.
  7. copy and distribute the .userlibraries file to all the other machines.
  8. in their User Libraries window, click Import and look for the copied .userlibraries file.
  9. click OK and save your settings.

Monday, January 7, 2008

simple properties file management

Use when:
1. a majority of classes have to each load its own set of settings.
2. properties file is located in folder outside the default classpath
3. a generic solution is needed for loading configuration files that are independent of the filesystem


==========

  1. create a new Class and have it named "ResourceManager"
  2. turn the class into a singleton by hiding the constructor and give it a method named getInstance() that returns an instance of the class
  3. create a static method that will handle file loading. name this method "getResource()" and have it accept a Class object named "name" as a parameter and have it return a Properties object
  4. pass the "name" object appended with ".properties" to the ClassLoader.getResourceAsStream() method to load a Properties file as an InputStream
  5. create a new Properties object and call its "load()" method using the InputStream from step 4

==========
Sample ResourceManager:

public final class ResourceManager {
private static ResourceManager inst;
private static Logger logger = Logger.getLogger(ResourceManager.class);

private ResourceManager(){

}

public static synchronized ResourceManager getInstance(){
if (inst==null)
inst= new ResourceManager();
return inst;
}
public Object clone() throws CloneNotSupportedException
{
throw new CloneNotSupportedException();
}

public Properties getResource(String name){
Properties r = new Properties();
try{
name=name.replace('.', '/');
r.load( ClassLoader.getSystemResourceAsStream(name+".properties") );
}catch(IOException e){
logger.error(e);
}
return r;
}
public Properties getResource(Class name){
return getResource(name.getName());
}
}



=========
The ResourceManager class does not have to be a singleton, but it gives the added bonus of being memory efficient because creating multiple instances of it is no longer necessary; it having only one usable method. It can also be modified so that file access is threaded, preventing any slowdown on particularly large files. But thats for another trick.

force fsck to run on reboot

Use when:
1. df reports incorrect figures
2. file size becomes 0
3. files go missing



==========
sudo touch /forcefsck