Add Scroogle to your search area in Firefox 2.0 Install the 'Scroogle Scraper' search plugin.

code


What if you have a high volume ordering site and you’re worried that if your database goes down, you’ll lose orders? Well, you could always throw an exception on a database connection failure and then write out the form request data to a file. Maybe something like:

try
{
    $db_connection = mysql_connect ($db_server, $db_username, $db_password);
    mysql_select_db ($db_database);
    if (!$db_connection)
    {
    throw new Exception('MySQL Connection Database Error: ' . mysql_error());
    }
    else
    {
    $result = mysql_query($sql);
    }
}
catch (Exception $e)
{
    $fileName=md5(microtime()).".txt";
    $orderInfo=base64_encode(serialize($_REQUEST));
    $fileString= mcrypt_ecb(MCRYPT_3DES, 'SECRETCODE', $orderInfo, MCRYPT_ENCRYPT);
    file_put_contents($fileName,$fileString);
}

so, the question goes a-like-a this: write a function that, given an array of strings, will return the number of those strings that contain the letters c,h,e,v,r,o and n in that order. there may or may not be other letters around and in between. Here’s was my first attempt:

$strings = array(
                 "i like cheetos, but everyone knows cheez-its are better",
                 "che guevara was born in argentina",
                 "i own a chevrolet",
                 "hello world"
                 );
 
echo(chevronMatch($strings));
 
function chevronMatch($strings)
{
  $chevron="chevron";
  $chevronCount=0;
  foreach($strings as $testString)
  {
    $hitCount=0;
    for($y=0;$y<strlen($testString);$y++)
    {
      if ($testString[$y]==$chevron[$hitCount])
      {
        if ($hitCount<strlen($chevron)-1)
        {
          $hitCount++;
        }
        else
        {
          $chevronCount++;
          break;
        }
      }
    }
  }
  return $chevronCount;
}

Obviously, iterative code like that would make a regex guru like bj upset. here’s my second attempt, this time with ereg

function chevronMatch($strings)
{
  $chevronsMatched=0;
  foreach($strings as $string)
    {
      $chevron=array('c','h','e','v','r','o','n');
      $regex="[a-z,\-\ ]*";
      $regexString=$regex.implode($regex,$chevron).$regex;
      if (ereg($regexString,$string)) $chevronsMatched++;
    }
return $chevronsMatched;
}

I had a friend send me a list of these questions today. some are repeats from previous posts but there are several new ones. Enjoy!

Logic Problems

a) 8 Steel balls, 1 heavier than all the rest. Use a Balance Scale to determine the heaviest ball in the shortest number of tries.

b) Find how many trailing zeroes are in the product of 100! (100 Factorial).

c) Replace each letter below with a corresponding number from 0 to 8. Each Letter can only be matched to one number (ie, all of the E’s would be a 3, and that would mean that no other Letter could be a 3). The following addition problem should work after you replace the letters.

   S  E  V  E  N
   S  E  V  E  N
+         S   I   X
-----------------------
 T W E N  T   Y

Programming Problems

a) Write a function that takes an array of integers from 1 to 1 million, with one number being duplicated. Determine which integer is a duplicate, accounting for speed and efficiency.

b) Write a function that takes an array of integers from 1 to 1 million, with one number being missing from the range. Determine the missing integer, account for speed and efficiency.

c) Write a function that takes an array of an number of integers. Determine the largest contiguous sum, meaning given any two integers in the array, what is the highest sum? Given an array such as Array(1, -5, 3, -3, -9, 2) the highest contiguous sum would be 5.

d) Write a function that takes a string as a parameter and determine the first unique character in the string. In other words, given the string “sissy” the answer would be “i”. Afterwards, how would you optimize the function.

e) Pseudo-code the Ball Clock problem, determining how many cycles it takes for the balls to end up in the same position in the queue tray. Afterwards, how would you optimize the process if it were to be hit thousands of times on a given interface by thousands of users. If you have come up with a pure brute-force method, how could you optimize it further to shorten the processing time?

reversing a string is a classic tech interview question. of course you’re not allowed to call any built-in reverse() function. A solution might look like, in my pseudocode:

someString = new string("732432424");
char temp;
int end=someString.length()-1;

for (int x=0;x<end;x++)
{
	temp=someString[end];
	someString[x]=someString[end];
	someString[end]=temp;
	end--;	
}

but sometimes the interviewer asks you to reverse the string in place, without using other memory, and for that, we’ll need our XOR friend

A B  XOR
----+---
0 0 | 0
0 1 | 1
1 0 | 1
1 1 | 0
someString = new string("732432424");
char temp;
int end=someString.length()-1; //assume zero based char arrays

for (int x=0;x<end;x++)
{
	someString[x]=someString[x] XOR someString[end]; 
        // first loop: someString[x]=3
	someString[end]=someString[end] XOR someString[x]; 
        //first loop: someString[end]=7
	someString[x] = someString[x] XOR someString[end]; 
       //first loop: someString[x]=4
	end--;	
}

1. http://www.php.net/manual/en/control-structures.alternative-syntax.php shows an alternative syntax for loops:

    foreach($list as $item)
    {
        echo $item;
    } 

can be done as:

    foreach($list as $item):
        echo $item;
    endforeach 

2. if your server has short tags enabled, you can do this:

<?

$somevar="hello";

?>

<?=$somevar?>

this script checks to see if a program is running and starts it if it is not. if a certain time has passed the script will kill the running program

#!/bin/bash
 
#location of script to monitor
PROGRAM='myscript.php'
COUNTER=0
 
#!/bin/bash
 
date2stamp () {
    date --utc --date "$1" +%s
}
 
# convert a date into a UNIX timestamp
# time afterwhich script should not run
finishtime=$(date2stamp "Thu Nov  1 15:22:00 MDT 2007") 
#echo $finishtime
 
while [ 1 ];
do
 
nowtime=`date --utc +%s`
#echo $nowtime
diffTime=$((finishtime-nowtime))
if ((diffTime > 0));
then
echo "still time to go" 
else
echo "TIME UP!: checking if running:"
PROG_CHECK=`ps aux|grep $PROGRAM|wc -l`
if [ $PROG_CHECK -gt 1 ];
then
echo "running after time up"
PROG_ID=`ps uax|grep $PROGRAM |head -n 1|awk '{print $2}'` 
#echo "KILLING"
#kill -9 $PROG_ID
else
echo "not running after time up"
fi
exit 65
fi
 
 
PROG_CHECK=`ps aux|grep $PROGRAM|wc -l`
if [ $PROG_CHECK -gt 1 ];
then
echo "running"
else
let COUNTER=COUNTER+1
echo "not running: starting: new log file: $COUNTER"
/usr/local/bin/php /root/$PROGRAM &
fi
 
#time in seconds to sleep
sleep 5
 
done

We recently upgraded from MySQL 4 to MySQL 5 and we noticed strange characters in some of the varchar and text fields.

step 1: dump out the contents of the bad field in hex
mysql> select hex(myfieldname) from mytablename where myid=’something’;

step 2: run a php program to print out the chars one at a time

function hex2asc($temp) {
  $len = strlen($temp);
  for ($i=0;$i<$len;$i+=2) {
  $data[$i]=chr(hexdec(substr($temp,$i,2)))."  ".substr($temp,$i,2);
 
  }
  return $data;
}
$str="HEX GOES HERE";
$data=hex2asc($str);
print_r($data);

step 3: once you’ve identified the bad chars and their hex values, change them in the database

here are some bad chars I found:

– fix apostrophe
update mytablename set myfieldname=REPLACE(myfieldname,UNHEX(’92′),”‘”);

– fix left single quote
update mytablename set myfieldname=REPLACE(myfieldname,UNHEX(’93′),”‘”);

– fix right single quote
update mytablename set myfieldname=REPLACE(myfieldname,UNHEX(’94′),”‘”);

– fix bullets
update mytablename set myfieldname=REPLACE(myfieldname,UNHEX(’95′),”& #8226;”);

– fix double dash
update mytablename set myfieldname=REPLACE(myfieldname,UNHEX(’96′),”–”);

– fix triple dash
update mytablename set myfieldname=REPLACE(myfieldname,UNHEX(’97′),”—”);

— fix supscripted TM
update mytablename set myfieldname=REPLACE(myfieldname,UNHEX(’99′),”<sup>TM</sup>”);

– replace jacked up apostrophe/single quote
– delete EFs
update mytablename set myfieldname=REPLACE(myfieldname,UNHEX(‘EF’),”");
– replace BFs with single quote
update mytablename set myfieldname=REPLACE(myfieldname,UNHEX(‘BF’),”‘”);
– delete BDs
update mytablename set myfieldname=REPLACE(myfieldname,UNHEX(‘BD’),”");

see also: http://www.oreillynet.com/onlamp/blog/2006/01/turning_mysql_data_in_latin1_t.html

Real Age calculators have become all the rage lately and so I decided to reverse engineer (and improve) a popular one (http://www.poodwaddle.com/realage.htm .) The poodwaddle calc is made in flash, but I made mine in php and javascript with an XML backend. Below is the code I used to read the Real Age XML into a PHP array. (oh, and you’ll also need the PHP XML parsing class from php.net.)

(http://healthtech.accordingtome.com/parseData.inc.phps)

if (!isset($_SESSION['questionArray'])) //cache
{
$lookupTable=array();
foreach($xml->children[0]->children as $lookup)
{
  if ($lookup->name=='row')
    $lookupTable[$lookup->attributes["input"]]=$lookup->attributes["output"];
}
 
$questionArray=array();
foreach($xml->children[1]->children as $questions)
{
  $tempQuestion=new Question();
  $tempQuestion->title=$questions->children[0]->content;
  $tempQuestion->prompt=$questions->children[1]->content;
  $tempQuestion->genderSpecific=$questions->children[2]->content;
  $tempQuestion->controllable=$questions->children[4]->content;
  $tempQuestion->options=array();
  foreach($questions->children[3]->children as $option)
    {
      $optionPrompt=$option->attributes["prompt"];
      $RAEffect=$option->attributes["RA-effect"];
      $tempQuestion->options[$optionPrompt]=$RAEffect;
    }
  $questionArray[]=$tempQuestion;
}
$_SESSION['questionArray']=$questionArray;
$_SESSION['lookupTable']=$lookupTable;
}

The actual Real Age code is pretty ugly, but I’ll post it as soon as I clean it up. Yes it works in IE and FF. Yes, the javascript slider code is slow (but it works!). It’s from the dojokit. It was the only vertical slidebar that allowed custom labels I could find.

healthitblogs_sml.jpgI recently stumbled upon Javascript/Canvas Graph library which allows you to create cool network graphs with nodes and interconnections. Now that I had a graphic library, I needed something with lots of connections to graph. That’s when I thought of mapping health IT blog sites. Now all I needed was a spider…

Spiders, robots, crawlers all work on the same principle: start with a seed url(s), request the urls and then parse out the resultant html for all link tags which are then pushed into the queue for crawling.

time for some code:

(http://www.ryanbyrd.net/linkSpider.phps)

<?
$tldList=file("tlds.txt");
$masterList=file("masterList.txt");
$acceptableNodes=array();
foreach($masterList as $node)
{
  $node="http://".trim($node);
  $acceptableNodes[]=parse_url_domain ($node);
}
//print_r($acceptableNodes);
$connections=array();
$nodeCounter=array();
foreach ($masterList as $webpage)
{
$url ="http://".trim($webpage);
 $strippedWebpage=parse_url_domain ($url);
 $input = file_get_contents($url); //or die("Could not access file: $url");
if (!$input) continue;
$regexp = "<a\s[^>]*href=(\"??)([^\" >]*?)\\1[^>]*>(.*)<\/a>";
$URLs=array();
if(preg_match_all("/$regexp/siU", $input, $matches, PREG_SET_ORDER))
{
  foreach($matches as $match)
    {
      //echo($match[2]."\t");
      $currentURL=parse_url_domain ($match[2]);
      //echo($currentURL);
      //echo("\n");
      if ($currentURL!=$webpage && !in_array($currentURL,$URLs)&&check_domain($currentURL)&&check_tld($currentURL))
{
 $URLs[]=$currentURL;
 if (in_array($currentURL,$acceptableNodes)&& ($strippedWebpage!=$currentURL))
   {
   $connections[]="$strippedWebpage -> $currentURL";
   $nodeCounter[$currentURL]++;
   }
}
 
    }
}
 echo("$webpage : \n");
 print_r($URLs);
}
echo("connections: ");
 print_r($connections);
echo("nodeCounter: ");
print_r($nodeCounter);
echo("javascript edges: ");
$multiplier=3;
foreach($connections as $connection)
{
  list($from,$to)=explode(" -> ",$connection);
  $fromCtr=3*$nodeCounter[$from];
  $toCtr=3*$nodeCounter[$to];
  echo("g.addEdge($('".$from."'), $('".$to."'),".$fromCtr.",".$toCtr.");\n");
}
function parse_url_domain ($url)
{
 
  $raw_url= parse_url($url);
  if ($raw_url['host'] == '')
  {
    $raw_url['host'] = $raw_url['path'];
  }
    $domain_only[1] = $raw_url['host'];
  return strtolower($domain_only[1]);
}
function check_domain ($url)
{
if (!ereg("^.*\..*$", $url))
{
  return false;
}
  $local_array = explode(".", $url);
  for ($i = 0; $i < sizeof($local_array); $i++)
    {
    if (!ereg("^(([A-Za-z0-9!#$%&#038;'*+/=?^_`{|}~-][A-Za-z0-9!#$%&#038;'*+/=?^_`{|}~\.-]{0,63})|(\"[^(\\|\")]{0,62}\"))$", $local_array[$i]))
      {
      return false;
      }
    }  
  return true;
}
function check_tld($url)
{
  global $tldList;
  $parts=explode(".",$url);
  $lastpart=trim($parts[count($parts)-1]);
  foreach($tldList as $item)
    {
      if (trim($item)==$lastpart)
return true;
    }
      return false;
 
}
?>

and no, I’m not talking about the Utah Summer Games Arm Wrestling competition.

I’m talking about Python, the programming language. And to encourage adoption of that language some clever people created a little Python programming game (back in 2005.) You’re presented with a riddle of sorts and you’re supposed to code up a python script to solve it. Only, I don’t like people telling me what to do, so I intentionally did NOT code up python to solve them. I used PHP mostly. Here are my notes:

QUESTION 1: what’s 2^38?
ANSWER: I asked google: http://www.google.com/search?hl=en&q=2%5E38&btnG=Google+Search
and then I used the answer to get to the next step: 274877906944.html

QUESTION 2: given: K->M, O->Q, E->G, decode: g fmnc wms bgblr rpylqjyrc gr zw fylb. rfyrq ufyr amknsrcpq ypc dmp. bmgle gr gl zw fylb gq glcddgagclr ylb rfyr’q ufw rfgq rcvr gq qm jmle. sqgle qrpgle.kyicrpylq() gq pcamkkclbcb. lmu ynnjw ml rfc spj.
ANSWER: I used an online cryptogram solver (though i could have written a simple script to shift up two letters…)
“map” then, shifts to “ocr”, which leads to http://www.pythonchallenge.com/pc/def/ocr.html

QUESTION 3: Find rare characters in the mess below (mess omitted)
ANSWER: php:

$challenge=file_get_contents('phychall2.txt');
echo(ereg_replace("[^a-z]","",$challenge));

which produces: http://www.pythonchallenge.com/pc/def/equality.html

QUESTION 4: “One small letter, surrounded by EXACTLY three big bodyguards on each of its sides.”
ANSWER: I used textpad’s regex ([a-z][A-Z][A-Z][A-Z][a-z][A-Z][A-Z][A-Z][a-z]) and found “linkedlist”, which means: http://www.pythonchallenge.com/pc/def/linkedlist.html

QUESTION 5: “urllib may help. DON’T TRY ALL NOTHINGS, since it will never end. 400 times is more than enough”
ANSWER:

$linked="12345";
for($x=0;$x<400;$x++)
{
$page=file_get_contents("http://www.pythonchallenge.com/pc/def/linkedlist.php?nothing=$linked");
echo($page."\n");
 $previouslinked=$linked;
 $linked='';
list($blank,$linked)=@split('and the next nothing is ',$page);
 $pos = strpos($page, "Divide");
if ($pos === false)
{
  if ($linked=='') die();
}
 else
{
   $linked=$previouslinked/2;
   echo("divide found!!");
 }
echo($linked."\n");
}

which produces: http://www.pythonchallenge.com/pc/def/peak.html

QUESTION 6: peak hell
ANSWER:
arghh. have to use python…need to load the pickle dump:

import pickle
unpicklefile = open('banner.p', 'r')
unpickledlist = pickle.load(unpicklefile)
unpicklefile.close()
for item in unpickledlist:
        print item
 
python unpickle.py > nextstep.txt

lines look like: [(' ', 14), ('#', 5), (' ', 70), ('#', 5), (' ', 1)]

parse them with:

$problem=file("nextstep.txt");
$parseout=array('(',']',')','[',"'");
function printit($value,$times)
{
  for($loop=0;$loop<$times;$loop++)
    echo($value);
}
foreach($problem as $line)
{
  $tuples=split('),',$line);
  foreach($tuples as $tuple)
    {
      list($first,$second)=split(',',$tuple);
      $first=trim(str_replace($parseout,'',$first));
      if ($first=='') $first=' ';
      $second=trim(str_replace($parseout,'',$second));
      printit($first, $second);
    }
  echo("\n");
}

which produces a nifty ascii art version of: http://www.pythonchallenge.com/pc/def/channel.html

QUESTION 7: : now there are pairs (in http://www.pythonchallenge.com/pc/def/channel.zip)
ANSWER:

$linked="90052";
for($x=0;$x<909;$x++)
{
  $bigArray[]=system("zipinfo -v channel.zip {$linked}.txt|tail -3|head -1",$retval);
  $page=file_get_contents("{$linked}.txt");
  $previouslinked=$linked;
  $linked='';
  list($blank,$linked)=@split('Next nothing is ',$page);
  $pos = strpos($page, "Collect");
  if ($pos === false);
  else
    {
      $x=10000;
    }
}
$counter=2;
foreach($bigArray as $dot)
{
  if ($dot=='') $dot=' ';
  echo($dot);
  if ($counter++%65==1) echo("\n");
 }

Which produces more ASCII art and leads to: http://www.pythonchallenge.com/pc/def/oxygen.html

QUESTION 8: the next level is [105, 110, 116, 101, 103, 114, 105, 116, 121]
ANSWER:

$im = imagecreatefrompng("oxygen.png");
for($x=3;$x<629;$x+=7)
{
$rgb = imagecolorat($im, $x, 46);
$r = ($rgb >> 16) & 0xFF;
$g = ($rgb >> 8) & 0xFF;
$b = $rgb & 0xFF;
 echo(chr($r));
}

more code:

$thelist=array(105, 110, 116, 101, 103, 114, 105, 116, 121);
foreach($thelist as $entry)
{
  echo(chr($entry));
}

http://www.pythonchallenge.com/pc/def/integrity.html

QUESTION 9:
un: 'BZh91AY&SYA\xaf\x82\r\x00\x00\x01\x01\x80\x02\xc0\x02\x00 \x00!\x9ah3M\x07<]\xc9\x14\xe1BA\x06\xbe\x084'
pw: 'BZh91AY&SY\x94$|\x0e\x00\x00\x00\x81\x00\x03$ \x00!\x9ah3M\x13<]\xc9\x14\xe1BBP\x91\xf08'
ANSWER: missing link : bee
use commandline python, arghh...

s = "BZh91AY&SYA\xaf\x82\r\x00\x00\x01\x01\x80\x02\xc0\x02\x00 \x00!\x9ah3M\x07<]\xc9\x14\xe1BA\x06\xbe\x084"
import bz2
bz2.decompress(s)
'huge'
t = "BZh91AY&SY\x94$|\x0e\x00\x00\x00\x81\x00\x03$ \x00!\x9ah3M\x13<]\xc9\x14\xe1BBP\x91\xf08"
bz2.decompress(t)
'file'
<code></p>
<p><strong>QUESTION 10: </strong>first+second=?<br>
<strong>ANSWER: </strong>
connect the dots
<code>[php]
$image = imagecreatefromjpeg("good.jpg");
$col_poly = imagecolorallocate($image, 255, 0, 0);
$firstArray=array(146,399,163,...);
$secondArray=array(156,141,165,...);
imagepolygon($image, $firstArray,count($firstArray)/2, $col_poly);
imagepolygon($image,$secondArray,count($secondArray)/2,$colpoly);
header("Content-Type: image/jpeg");
imagejpeg($image);

http://www.pythonchallenge.com/pc/return/cow.html

http://www.pythonchallenge.com/pc/return/bull.html

QUESTION 10: a = [1, 11, 21, 1211, 111221, len(a[30]) = ?
ANSWER:
googled for code:

#!/usr/bin/perl
$str="1"; for (1 .. shift(@ARGV)) { print($str, ", "); @a = split(//, $str); $str=""; $nd=shift(@a); while (defined($nd)) { $d=$nd; $cnt=0; while (defined($nd) && ($nd eq $d)) { $cnt++; $nd = shift(@a); } $str .= $cnt.$d; } } print($str);

paste into textpad for character count

http://www.pythonchallenge.com/pc/return/5808.html

QUESTION 11: odd even
ANSWER:
PBM (Portable BitMap) file (PBM stores single bit pixel image as a series of ascii "0" or "1"'s. The magic identifier for PBM is "P1".)

32 0s and 1s (separated by spaces) on 20 rows makes 640
then switch to 1s and 0s and do this 240 times


print "P1\n", "640 480\n";
my $odd = ( "0 1 " x 16 . "\n" ) x 20;
my $even = ( "1 0 " x 16 . "\n" ) x 20;
for ( 1 .. 240 ) { print $odd, $even }

gimp:
load image
load mask.txt as a layer
select that layer
layer->color to alpha
white->alpha

produces: evil

Next Page »

Send to a friend * Print this page * Join the club * Talk with my robot * Advertise here * Search this Site * Donate * Link to me


Web hosting by Utah Hub *  Powered by CreativeTap *  In association with Segomo
Unless otherwise noted, Copyright 2004-2013, Ryan Byrd. All Rights Reserved.
Ryan Byrd dot net -- probably the coolest site in Utah