Country City Longitude Latitude Database setup in php

Ok, a nice Friday night here and I am working on a project that highly involves the geospatial data. For that I needed data comprising the info I needed.
Thankfully this website provided me the data as one big text file.

Then I wrote this simple snippet for porting the data to my kitchen database 😉
The script should be used only for temporary purpose and by no means on production. It doesn’t do any sanitation or what so ever the good programming.. but it does the job!
I created country_city table with the desired columns only;

CREATE TABLE `country_city` (
  `country_city_id` int(11) NOT NULL AUTO_INCREMENT,
  `country_code` char(2) NOT NULL,
  `city_name` varchar(100) DEFAULT NULL,
  `region` varchar(100) DEFAULT NULL,
  `latitude` float DEFAULT NULL,
  `longitude` float DEFAULT NULL,
  PRIMARY KEY (`country_city_id`)
) ENGINE=InnoDB AUTO_INCREMENT=3170001 DEFAULT CHARSET=latin1

Then I run the following code to populate the data.

   <?php
   /**
    * @author Kaleb Woldearegay 
    * Code to be used "as is". Not responsible for any consequences after using the code.
    */
   const ROWS_TO_INSERT = 5000;
   $file_handle="/path/to/worldcitiespop.txt";
   $fh=fopen($file_handle, 'r');
   $query_pool=array();
   $db_handler=mysql_connect("localhost", "root", "");
   mysql_select_db("your database here");
   //assumed the database is connected at this moment..
   while(!feof($fh))
  {
      $line=fgets($fh, 1024);
      $data=explode(',', $line);
      $city=mysql_real_escape_string($data[1]);
      $query_pool[] = "(null, '{$data[0]}', '{$city}', '{$data[3]}', {$data[5]}, {$data[6]})";
      if (count($query_pool)>=ROWS_TO_INSERT)
      {
          $query = "INSERT INTO country_city VALUES " . implode(',', $query_pool);
          if (!mysql_query($query, $db_handler)) die('Error: '. mysql_error($db_handler));
          $query_pool=array();
      }
  }

That is it,
Enjoy!

symfony production path not working but works on dev environment

If you are working on the symfony and testing the changes, and you want to look at how it looks on the production env by just changing the url.. and if you are not seeing your current changes – most probably it is caching issue:
do the following being in your symfony project..

php app/console cache:clear --env=prod --no-debug

That is it

Process Commands in Linux

To stop the current process and get back to the shell:

ctrl+z

To put the current process in the backgroup

bg

To bring the background process to front

fg

To send the the job to background on one line, put ambersand (&) at the end eg usingvi command:

vi somefile.txt &

To see all the background jobjs

jobs

Bringing specific job from background to foreground

fg %1 - this will bring the job number 1 to front

List all the running processes

ps aux

To filter some process, like to get the process id and stuff

ps aux | grep "process name"

flush memcache contents from command line

We all love caching right? We have a bunch of ’em these days: query cache, file cache, page cache..
Ok, memcache.. what if you quickly wanted to flush all the contents of it on the server, just use this:

echo "flush_all" | nc  

An example for local memcache could be:

echo "flush_all" | nc localhost 11211

you would see “OK” on the command prompt after successful clearing of the cache.
happy memcaching! 🙂

The dist file “app/config/parameters.yml.dist” does not exist. Check your dist-file config or create it.

Are you upgrading symfony to 2.3. Bum! This will be the problem you would face after upgrading the composer.json file and trying to do 

composer.phar install 

the solution is simple. Just copy the existing parameters.yml file from app/config/ folder to new file called parameters.yml.dist and rerun the command

Single id is not allowed on composite primary key in entity Doctrine error

You might get the above error on PHP Doctrine

if you got the above error, then it means you have two or more ids as primary in your object representing the table.

Example:

class Member
   /** @id 
    * @Column(type="integer") 
    * @GeneratedValue(strategy="AUTO")
    */
   private $id;
   /** @id @Column(type="string") */
   private $key;
...

The above declaration would create the above error and taking out the generatedValue part can resolve the issue.

See the solution to common error of new entity was found though relation while using doctrine

binary tree problems with solution

today is saturday and was catching upon some blogs. Then come across some binary tree algorithms and it reminded me the famous stanford binary tree questions.. decided to work on those and got to the mid of it..
Actually the questions get harder as you go further.. the first 7 are relatively easy..
I will continue to work on them and post my solution here.
the solutions are given on the this page but, it is advisable to work them out without looking a the solution..

here it is!


#include
#include
/*
 * @author https://gullele.com
 * binary tree problems and solutions.
 */
struct Node
{
	int number;
	struct Node *left;
	struct Node *right;
};

int minValue(struct Node *head);
int maxDepth(struct Node *head);
int countNode(struct Node *head);
void printTree(struct Node *head);
void postOrderTraversal(struct Node *head);
struct Node *createNode(int value);
int hasPathSum(struct Node *head, int sum);
struct Node *head = NULL;
struct Node *head2=NULL;
int main()
{
	struct Node *head=createNode(10);
	struct Node *left=createNode(8);
	struct Node *right=createNode(15);
	struct Node *right1=createNode(5);
	struct Node *right2=createNode(1);
	head->left=left;
	head->right=right;
	left->left=right1;
	right1->left=right2;

	struct Node *head2=createNode(5);
	struct Node *two=createNode(2);
	struct Node *seven=createNode(7);
	struct Node *eleven=createNode(11);
	struct Node *lfour=createNode(4);
	struct Node *thirteen=createNode(13);
	struct Node *eight=createNode(8);
	struct Node *rfour=createNode(4);
	struct Node *one=createNode(1);
	
	head2->left=lfour;
	head2->right=eight;
	lfour->left=eleven;
	eleven->left=seven;
	eleven->right=two;
	eight->left=thirteen;
	eight->right=rfour;
	rfour->right=one;

	printf("Size of the tree is %d n", countNode(head));
	printf("Max depth is %d n", maxDepth(head)-1);
	printf("Minimum Value is %d n", minValue(head));
	printTree(head2);
	printf("n");
	postOrderTraversal(head);
	int hasSum = hasPathSum(head2,17);
	if(hasSum)
		printf("it has sum");
	else
		printf("it does not has sum");
	return 0;
}

/**
 * Takes the head of the binary tree and counts how many children are there in the tree
 * it will recursively count the left and right nodes to come to the conclusion
 */
int countNode(struct Node *head)
{
	if (head==NULL)
	{
		return 0;
	}
	return countNode(head->left)+1+countNode(head->right);
}

/**
 * Finds the maximum depth of the tree
 *
 */
int maxDepth(struct Node *head)
{
	int maxLength = 0;
	if (head==NULL)
	{
		return 0;
	}
	else
	{
		int leftMax = 1 + maxDepth(head->left);
		int rightMax = 1 + maxDepth(head->right);
		if (leftMax > rightMax)
		{
			return leftMax;
		}
		return rightMax;
	}
}

/**
 * Works on the Binary Search Tree - since on the BST, for sure the left child is always lesser in value.
 */
int minValue(struct Node *head)
{
	if(head==NULL)
		return 0; //might not be valid answer here
	struct Node *current=head;
	while(current->left!=NULL)
	{
		current=current->left;
	}
	return current->number;
}

/**
 * Prints the value of the BST
 * this is inorder traversal
 */
void printTree(struct Node *head)
{
	if (head==NULL)
	{
		return;
	}
	else
	{
		printTree(head->left);
		printf("%d, ", head->number);
		printTree(head->right);
	}
}	

int hasPathSum(struct Node *head, int sum)
{
	int localsum = 0;
	if (head == NULL)
	{
		return 0;
	}
	else if(head->left==NULL && head->right==NULL)
	{
		return (sum-head->number == 0);
	}
	else
	{
		int temp=sum-head->number;
		return hasPathSum(head->left, temp) || hasPathSum(head->right, temp);
	}
}
/**
 * Post order traversal version of the tree traversal
 */
void postOrderTraversal(struct Node *head)
{
	if (head==NULL)
	{
		return;
	}
	else
	{
		printTree(head->left);
		printTree(head->right);
		printf("%d, ", head->number);
	}
}

/**
 * Create new node
 */
struct Node *createNode(int value)
{
	struct Node *newNode=malloc(sizeof(struct Node));
	newNode->number=value;
	newNode->left=NULL;
	newNode->right=NULL;
	return newNode;
}