Wednesday, April 22, 2009

Installing ImageMagick / Imagick for PHP on Linux CentOS

This was tricky, so thought I'd post for peeps having problems.


1.yum install ImageMagick


2.yum install php-devel (if not installed)

NOTE: skipping step 2 leads to this problem..."ERROR: `phpize' failed".


3.yum install ImageMagick-devel

NOTE: skipping step 3 leads to this problem ... "ERROR: `/tmp/tmppccQA1/imagick-2.2.2/configure --with-imagick' failed"


4. WRONG: pecl install imagick

had problem : PHP Warning: PHP Startup: Unable to load dynamic library '/usr/lib/php/modules/imagick.so' - /usr/lib/php/modules/imagick.so: undefined symbol: ClonePixelWand in Unknown on line 0


fixed by uninstalling : pecl uninstall imagick


4.RIGHT : pecl install imagick-2.2.1 (don't just run pecl install imagick, version 2.2.2 doesn't work)


5. echo "extension=imagick.so" > /etc/php.d/imagick.ini (might not be neccessary)


6. vi /etc/php.ini -> add extension=imagick.so


7. /etc/init.d/httpd restart


8.php -m | grep imagick (to check if loaded.)


AND finally it should work! Hope this helps!

Thursday, April 9, 2009

SQL: Distinct vs group by

...Okay, this isn't Java related, but I'm mostly doing PHP + SQL Server queries these days and I'm too lazy to make a new blog.


As I'm still a bit of a beginner when it comes to SQL (mostly just know basic selects and inserts... even my joins are rather rusty) I had a problem with select statement. Even though I wanted to get data cross-referenced from a bunch of tables, I only wanted data where the first column was unique.

"so this is a job for distinct, right?"

Wrong. This is really a job for group by, and this is why:


(quoted from "Jeff's SQL Server Blog") :

http://weblogs.sqlteam.com/jeffs/archive/2007/10/12/sql-distinct-group-by.aspx


I'm reproducing the text below because I hate it when links become outdated.


By The Way ... DISTINCT is not a function ...

Have you ever seen (or written) code like this:



select distinct(employeeID), salary

from salaryhist


That compiles and executes without returning any errors. I've seen that attempted many times over the years, and of course people think DISTINCT is "broken" and "not working" because they see multiple rows for each employeeID. "But I asked for only distinct employeeIDs!" they say.


Well, the DISTINCT has nothing to do with the EmployeeID column; it is not a function that accepts arguments! It is just a tag that you can put after the word SELECT to indicate that you want only distinct combinations of all columns in the result set returned.


That syntax is accepted because (employeeID) is just an expression, a reference to a column, which happens to be surrounded by parenthesis. For example, you could write:



select distinct (employeeID), (salary)
from salaryhist


or:


select (employeeID), (salary)
from salaryhist



or even:



select distinct ((employeeID)), ((salary))
from salaryhist



Nothing is indicating that DISTINCT should be "operating" on the employeeID column; it is just a column reference in the SELECT clause that happens to be surrounded by parenthesis.


So, remember:


DISTINCT always operates on all columns in the final result
DISTINCT is not a function that accepts a column as an argument
When you do want to return multiple columns in your result, but only have them be distinct for a subset of those columns, you would use GROUP BY. And, of course, you must specify how you'd like to summarize all non distinct/grouped columns for any others you'd like to return:



select employeeID, max(salary) as MaxSalary
from salaryhist
group by employeeID



Notice that now we are getting distinct EmployeeID values, and the max salary per EmployeeID. This will truly return exactly one row per EmployeeID, unlike the initial DISTINCT example. And, in this case, MAX() is indeed a function that accepts and acts upon an argument -- unlike DISTINCT!

Thursday, January 15, 2009

A hint

Sometimes you get to wondering when to make objects... or when to stick to a basic premade type and call some methods in your normal class to change them.

When you find yourself wanting to do something like...
myThing = doSomethingToMyThing(myThing); //if it's local or
myThing = doSomethingToMyThing(); //if it's global

you know you should really make that method belong to myThing's class, since all you want to do is change something about that object.
If there's no such handy method in the MyThing class, it may be time to make your own object extending it, and give it the method. It's the OO way!

cuz myThing.doSomething(); just looks cleaner, don't it?

Thursday, January 8, 2009

No join method?!

Wow, I was raised on perl so this came as a bit of a shock...

the opposite of split is... nothing

boo. shame on you, Sun.

Thursday, June 12, 2008

mysterious smells

One of our problems at this company is the need to write, re-write, and edit a huge amount of the code base really fast. Since we have demos, releases and branches coming up in a few weeks (less now that I'm going to be going back to Japan soon), there is a feeling of muted urgency.


The good news: we're pretty good at doing what is needed very quickly.

The bad news: our code is starting to smell.


What do I mean by smell? A 'code smell' is a term I just learned the other day. Basically it's a combination of less-than-optimum coding practices, usually introduced by a lack of refactoring, or using procedural programming techniques (because they're more intuitive/easier to implement) when in the long run the code would be much easier to maintain and understand using object oriented principles.


Here is a list stolen from http://wiki.java.net/bin/view/People/SmellsToRefactorings
(which in turn was summarized from the classic book "Refactoring" by Kent beck.)















































SmellDescriptionRefactorings
Comments Should only be used to clarify "why" not "what".

Can quickly become verbose and reduce code clarity.
Extract Method

Rename Method

Introduce Assertion

Long Method The longer the method the harder it is to see what it’s doing.
Extract Method

Replace Temp with Query

Introduce Parameter Object

Preserve Whole Object

Replace Method with Method Object

Long Parameter List Don't pass in everything the method needs; pass in enough so that the method can get to everything it needs.
Replace Parameter with Method

Preserve Whole Object

Introduce Parameter Object

Duplicated Code
Extract Method

Pull Up Field

Form Template Method

Substitue Algorithm

Large Class A class that is trying to do too much can usually be identified by looking at how many instance variables it has. When a class has too many instance variables, duplicated code cannot be far behind.
Extract Class

Extract Subclass

Type Embedded in Name Avoid redundancy in naming. Prefer schedule.add(course) to schedule.addCourse(course)
Rename Method

Uncommunicative Name Choose names that communicate intent (pick the best name for the time, change it later if necessary).
Rename Method

Inconsistent Names Use names consistently.
Rename Method

Dead Code A variable, parameter, method, code fragment, class, etc is not used anywhere (perhaps other than in tests). Delete the code.
Speculative Generality Don't over-generalize your code in an attempt to predict future needs.
If you have abstract classes that aren't doing much use Collapse Hierarchy

Remove unnecessary delegation with Inline Class

Methods with unused parameters - Remove Parameter

Methods named with odd abstract names should be brought down to earth with Rename Method



There are more on that site, and even more in the book. I should really buy it. But it might just sit on the shelf like my 'Design Patterns' book. Oh well, at least my coworker found use for it and has been semi-permanently borrowing it.
But I digress.

Friday, May 16, 2008

Perly Java

So, if you have even a tiny bit of Java experience you know about the normal format of the if/then/else control flow.

if(something that might be true){
do this;
}else{
do that;
}

or alternatively,
if(something that might be true){
do this;
}else if(something else that might be true){
do that;
}else{
do the alternative.
}

Of course there are a number of ways to make these statements shorter, like ommitting closing curly braces if the 'do this' operation is one line, etc.
These shorter ways are a little harder to read, but make the code a little more compact which can be a good thing.
But there is an even SHORTER way! If you just have a simple if/then/else statement, nothing fancy, just one operation for the if and the else, then you can get it down to one line.

To make this even more cryptic, it is not even necessary to use the words 'if' or 'else' in there at all: in place of if is '?' and in place of else is ':'.
So the above code fragment would look like this:

(something that might be true)?do this:do that;

This is getting suspiciously like Perl, if you ask me. Java heresy! ;)

Friday, May 2, 2008

Singletons: I finally get it

When I was trying to make a map for a servlet that is created long before I can pass stuff to it, I realized I need a way to make a map of user's input from the GUI, give it to the servlet, and read that map from the server side. But it can't just be any old instantiation of a map object. It has to be the ONE instance that I actually put stuff in, so I know where to point on the server side from the servlet's data processing methods.

I had heard about singletons, and in fact had to study about them before. But I studied them in a kind of abstract way and never really had to use them - until now.

Here is a great great understandable explanation from "Using the Singleton Pattern"
by Budi Kurniawan (http://www.onjava.com/pub/a/onjava/2003/08/27/singleton.html).


How do you write a Singleton class? Simple: create a public static method that is solely responsible for creating the single instance of the class. This also means that the client of the class should not be able to invoke the Singleton class's constructor, either. Because the absence of a constructor will make the compiler create a no-argument public constructor, a class applying the Singleton pattern has a private or protected constructor. Because the constructor is private or protected, there is no way a client can create an instance of that class by calling its constructor. The constructor is not accessible from outside of the class!


If the only constructor cannot be accessed, how do we get an instance of that class? The answer lies in a static method in the class. As mentioned above, a Singleton class will have a static method that calls the constructor to create an instance of the class and return this instance to the caller of the static method. But isn't the constructor private? That's right. However, remember that the static method is also in the same class; therefore, it has access to all members of the class, including the private members of the class.


You might ask the following question: "You can't create an instance of a class by calling its constructor, so how do you call the static method (responsible for creating the single instance of the class) without having the class instance?" Note, though, that static members of a class can be invoked without having an instance of that class. To limit the number of instances to one, the static method has to check if an instance has been created before. If it has, it simply returns a reference to the previous created instance. If it has not, it calls the constructor to create one. It's as simple as that.



So to get my map, I create a singleton class to hold my data, create a static getInstance method, and instantiate it from the GUI with my data mapping. Then on the server, I call the getInstance method (which will pass me back the ONE object with my map), and voila!