Tuesday, August 4, 2009

PHP - Get a list of a particular day of the week between two dates

This is a modified version of function in the previous post. I had to modify it for a project I was doing.


****************************************************************************


function dayOfWeekListDateRange($start, $end, $day_of_week)

{
$range = array();

if (is_string($start) === true) $start = strtotime($start);
if (is_string($end) === true ) $end = strtotime($end);

if(!empty($day_of_week))
{
do
{
if(strcmp(strtolower(strftime("%A",$start)),strtolower($day_of_week)) == 0)
{
$range[] = date('Y-m-d', $start);
$start = strtotime("+ 1 day", $start);
}

else $start = strtotime("+ 1 day", $start);

}

while($start <= $end);
}

else
{

do
{

$range[] = date('Y-m-d', $start);
$start = strtotime("+ 1 day", $start);

}

while($start <= $end);
}

return $range;
}

PHP - Get a range of dates between two dates

function dateRangeArray($start, $end)
{
$range = array();

if (is_string($start) === true) $start = strtotime($start);
if (is_string($end) === true ) $end = strtotime($end);

do {
$range[] = date('Y-m-d', $start);
$start = strtotime("+ 1 day", $start);
} while($start <= $end);

return $range;
}

Credit: http://boonedocks.net/mike/archives/137-Creating-a-Date-Range-Array-with-PHP.html

PHP - Serialize an array for use in a MySQL table

This is the function I made to "serialize" a PHP array for dumping into a MySQL table into a readable, searchable format. It separates each value with an uncommon character , "|".

When you grab the "serialized" data out of the DB later, you should run the following to convert it back to an array --

$values_array = explode("|", $seralizedValues);

I'm aware that there is a PHP function to serialize data, but I wanted to make my own simpler, easier version that did not insert the array keys or any other junk into the array. Take it to leave it.

*******************************************************

function serializeArray($arr)
{
$temp = "";

if(!empty($arr))
{
$iter = 0;
$arr_size = count($arr);

foreach ($arr as $item)
{
$iter++;
$temp.=$item;
if($iter!==$arr_size) $temp.="|";

}
}

return $temp;
}

PHP - Format a variable for a MySQL query

This is my personal, very simple function I use to get a variable ready for use in a MySQL query.

*****************************************************

function sqlformat($var)
{
return "'".addslashes(trim($var))."'";
}

PHP - Find min and max values in an array

/**
signature
array getMinMax( array )

returns an associative array with:
'min' -> smallest value in the given array
'max' -> greatest value in the given array

if the array is empty both fields are NULL
*/
function getMinMax($array)
{

reset($array);
if(
FALSE === key($array))
{
return array(
'min' => NULL, 'max' => NULL);
}

$min = $max = current($array);
$val = next($array);

while(
NULL !== key($array))
{
if(
$val > $max)
{
$max = $val;
}
elseif(
$val < $min)
{
$min = $val;
}
$val = next($array);
}
return array(
'min' => $min, 'max' => $max);
}


Usage:

$min_max_arr = getMinMax($myarray);

$min_val = $min_max_arr['min'];
$max_val = $min_max_arr['max'];

(found here -- http://www.codingforums.com/showthread.php?t=130494)

Example application -- If you had an array of dates, you could turn each entry into a timestamp, run the array of timestamps through this function, and get the minimum and maximum timestamps. Then you could simply convert the min and max timestamps back to a string (using something like strftime).

Wednesday, April 29, 2009

Why the Swine Flu is more dangerous than the regular flu

Why is this strain dangerous?
***********************
********

There are three reasons why this issue is more serious than the regular flu.

a) The main issue with this strain is that no one has a natural immunity to it, because it has never really been seen before this point in time in it's current genetic form. And a vaccine can take months to develop. Vaccines generally take at least 9 months to develop under normal conditions, and even the accelerated development of the vaccines for this strain will take until at least September to develop. You can see where problems are going to arise. People are just going to keep on catching it and not fighting it of effectively, and then pass it on to others, because we have nothing to fight it off completely yet. To be more specific, this new strain has taken on genetic elements from animal viruses, potentially making it (genetically) unique enough to pose a pandemic threat. Experts say that our current seasonal flu vaccines are not going to be effective against this strain at all.

b) This particular strain seems to attack the young and healthy, rather than the sickly, old, or extremely young. The people who died in Mexico were younger (healthy people in their 20s, 30s, and 40s). The problem with this is that when a virus attacks healthy people preferentially, it suggests that the strain is completely new and is causing overreactions in the immune system. Basically, the logic is that this strain is causing the body to create abnormally large numbers of normally helpful inflammatory antibodies, which are so abundant that they actually end up causing more harm than good. This is exactly what happened with the bird flu fairly recently.

c) It's all about the potential ... it's not about what's happening right now. Even though most of the cases so far in the United States have not been very serious (except for that one kid who died), the virus spreading across the U.S. is identical to the strain of the virus that is killing people in Mexico (genetically speaking), meaning that the possibility that there could be similar deaths in the U.S. is not completely unfathomable.

What is the main alarm bell?
******************************

Sudden onset fever. Watch out for this in particular.


Are there are signs of hope?
***********************
*****

Influenza strains don't like the heat of summer. So this issue is going to die out somewhat (or significantly) during the summer months. This gives us a short window of a few months to develop a vaccine as rapidly as possible.


What's the best way to prevent getting this?
************************************
*********

All we can really do is use hand sanitizers and wash our hands with soap whenever we touch a public surface. Also, if you suspect someone has the flu around you, get at least 3 - 6 feet the heck away from them.

Sunday, March 29, 2009

Creating Samba shares with no username or password in Ubuntu Linux

Samba sometimes frustrates me. It seems to be very picky about under what circumstances it will actually let you broadcast the existence of your Linux machine on your LAN, and share a folder with read and write permissions for other Linux or Windows users to see.

After a little tinkering, here's how I went about doing just that.

(thanks to http://www.debuntu.org/guest-file-sharing-with-samba) for most of the tips)

********

(1) Make sure you have Samba installed. As far as I remember, it is included with most distributions, but just in case, try this --

sudo apt-get install samba

(2) Now you need to modify the Samba configuration file located at /etc/samba/smb.conf and make some changes to remove the necessity to type in a username and password every time you wish to access a share. Run --

sudo gedit /etc/samba/smb.conf

(3) At some point, you might want to share a folder that does not belong to you on the network. To allow this, under the [global] section of this file, add (copy + paste) the following line --

usershare owner only = False

(4) Find the variable "security" (in the global section) and ensure that it is set to "share". The security line should look like this --

security = share

(if you absolutely can't find the security variable anywhere, add it to the file under the global section)

(5) Find the variable "guest account" (in the global section) and ensure that is set to "nobody". The guest account line should look like this --

guest account = nobody

(if you absolutely can't find the guest account variable anywhere, add it to the file under the global section)

(6) One guide I found said that since you are making Samba security insecure, you should ensure that only your local network can access the Samba service. I personally did not end up keeping this line in my smb.conf, because I did not seem to have any success getting Samba up and running by adding this to the config file, but you can (and probably should) at least try this to make sure it works. So go ahead and add this in, and if you can't access Samba/any shares after finishing the guide, remove the line altogether (or make sure you have permitted the right interface to bind).

To try this, you need to set the interfaces variable to lo and your local network interface (e.g eth0, eth1, wlan0) and you need to specify that only these interfaces can bind

interfaces = lo eth0
bind interfaces only = true

(7) Now, smb.conf should be set. Restart the samba daemon like this --

sudo service samba restart

(8) At this point, you have two options to add a shared folder on your machine. There's the easy way, that actually seems to work, and there's the hard, theoretical way, that I havn't had any sucess why. I'll go over the easy way first.

The easy way to share a folder is similar to the way you share a folder in Windows. All you need to do is right click on the folder in the question, press "Sharing Options", and fill out the resulting dialog. I recommend the following options --



At this point, you should be done. Congratulations. You should be able to access your shared folder by browsing your workgroup from another machine (Windows or Linux-based).

As far as I know, the name of your server is the host name of your computer, truncated to 15 characters. For example, the host name of my computer is andrew-laptop-mint. I can access my samba shares from Windows, for example, with \\andrew-laptop-m\Share (for example). You can get your host name by simply opening up a terminal and typing in hostname.

EXTRA: Here's the hard, theoretical way to add a shared folder in Samba --

(1) Run the following --

sudo gedit /etc/samba/smb.conf

(2) Near the bottom of the file, or where the other entires of this sort seem to be, add the following text (replacing generic items I've written in with your own variables, of course)

[generic-share]
path = /folder/to/share
comment = Insert comment here
read only = no
available = yes
browseable = yes
writable = yes
guest ok = yes
public = yes
printable = no
share modes = no
locking = no


(3) Run this --

sudo service samba restart

(4) You should have a shared folder now, although I can't say I've had any success with this. What's even more interesting is that the "Sharing options" method I described above doesn't seem to add anything of this sort to smb.conf. I don't know what's going on, maybe someone can enlighten me.

Good luck!