Sunday, July 29, 2012

Texting from Excel

I have figured out how to send a text from Excel. It is really sending a POST request to my website using VBA and passing the phone number and message from 2 cells in the spreadsheet. Put the phone number in A2 and the message in B2. Then press Alt F11 to open the VBA code editor. Under Microsoft Excel Object on the left pane open the current spreadsheet. Or you could add the code to a new module by right clicking on Modules and choosing insert module. Next put this code in it.
Private Sub GetWebRequestButton1_Click()
    'get the numbers to send to the website to get a response
    Number = Sheets("texting").Range("A2").Value
    Message = Sheets("texting").Range("B2").Value
    
    'This sends a post to the website and put the response in the range supplied
    With ActiveSheet.QueryTables.Add(Connection:="URL;http://yourwebsite.com/VBAtexting.php", Destination:=Range("C2"))
        .PostText = "sendtext=1&number=" & Number & "&message=" & Message
        .RefreshStyle = xlOverwriteCells
        .SaveData = True
        .Refresh
    End With
End Sub
It works great.
You will also need the code for texting using google voice on your website but it is pretty simple and I use it all the time to send automated texts.

Friday, March 16, 2012

Send text to remote server using an Iframe

Here is an example to post text to a remote server. And you can print javascript in the remote server if you want to change the page you have the Iframe on to say something like success. Or a popup saying it finished. On the remote server you can print this to make a popup: <script> parent.document.getElementById('postmessage').style.display='block'; parent.alert('Successfully posted');</script> On the webpage you want to send information from make a form and Iframe like this.
<span id="postmessage" style="display:none">Success Message</span>
<form action="http://www.remoteserver.com/upload_test.php" method="post" target="post_to_iframe">
  <input type="hidden" value="the text to send to remote server" />
  <input type="submit" value="Submit" />
</form>

<!-- When you submit the form it will submit to this iFrame without refreshing the page and it will make the popup and display the message. -->
<iframe name="post_to_iframe" style="width: 600px; height: 500px;"></iframe>

Sunday, January 22, 2012

Password strength

Recently I joined Lastpass.com for free password management. It is great to have this secure website help keep my passwords safe while using a different password for every site I have registered at. I the past I had used the same password but now they are all 30 characters using letters, numbers and special characters. Here is a sample password that lastpass will generate for you: z$7cAP%#Ak%r39x!PU5e2Nq1As*2Np I have changed 35 or so different sites passwords to different passwords and it was simple. Now if one site stores the passwords in plain text and a hacker gets it then I will just change that one password to a different one using lastpass in a minute. And the hacker won't be able to get into any of my other sites. One thing I liked was how secure you can make lastpass forum for instance. They allow your password to be upto 255 characters. But while I was changing passwords I found something surprising. The only 2 sites that I wasn't able to use my 30 character password on was financial sites. Wellsfargo forces it to be 14 or less and paypal.com forces the password to be 20 or less. How come all the biggest sites on the internet let you use a 30 character password and then where you want a stronger password it has to be half the size? I think they should allow 255 character passwords. It isn't something that should use more computer power to store a longer password. It's just one line of code usually to change the length allowed in login systems.

Saturday, December 10, 2011

Saving includes to a variable

I was reading a forum post and they wanted to save an include to a variable when making new forums on their website. I thought about it and here is what I came up with:
<?php
function get_include($path, $cat_id = null){
     ob_start(); // start buffer
     include $path;
     $content = ob_get_contents(); // assign buffer contents to variable
     ob_end_clean(); // end buffer and remove buffer contents
     return $content;
}
$render = array();
$render[] = "testing1";
$render[] = "testing2";
$category['fid'] = '134';
echo "<pre>";
$render[] = get_include('add_forum.php', $category['fid']);
$render[] = get_include('add_forum.php', $category['fid']);
print_r($render);
?>



and the forum_add.php looks like this:
<?php
echo "here is your id: $cat_id";
?>


The result looks like:
Array
(
    [0] => testing1
    [1] => testing2
    [2] => here is your id: 134
    [3] => here is your id: 134
)



Isn't this a nice way of both saving an include to a file and passing a variable to the include in a function.

Friday, November 25, 2011

Quick install LAMP server on Ubuntu

Here is the site I am going to summarize here: https://help.ubuntu.com/community/ApacheMySQLPHP
I am using Ubuntu 10.10 for this install. It should take 10 minutes or so to follow these steps.
The fastest way to install Appache2, PHP5.3, and MySQL is to use this command:
sudo tasksel install lamp-server
If you are using 11.04 then tasksel might not be installed. Then use this to install it:
sudo apt-get install tasksel
Tasksel will install the Lamp server but won't remove it, but we won't need to remove it.
At this point go to http://localhost and it should say "It works!"
Next use this command to make a new site:
sudo cp /etc/apache2/sites-available/default /etc/apache2/sites-available/mysite gksudo gedit /etc/apache2/sites-available/mysite
Make a folder in your home folder called webhome or anything you want to put your website in instead of the default var/www because I like to be able to edit the website files from my home so I own them and don't have to use sudo to edit them as root. Edit the DocumentRoot line to point to your new web root: /home/user/webhome/
Change the Directory directive by fixing the path to point to your webhome folder. Instead of <Directory /var/www/> use <Directory /home/user/public_html/>
After saving the file in gedit use these commands to disable the default website and enable the new website.
sudo a2dissite default && sudo a2ensite mysite sudo /etc/init.d/apache2 restart
Next make a index.php file in the webhome folder that says:
<?php phpinfo(); ?> Now go to: http://localhost
You should see the php configuration showing all the php settings.
This was pretty easy. They have streamlined alot of these steps.

Tuesday, November 22, 2011

Idea for making midi or tracker sequencer in html

I would like to make a sequencer in html5. I think its possible and I have been researching how it can be done. The main problem will be making it work in the main browsers and not just 1 or 2. You could make tracker mod music play from firefox by installing vlc and check vlc firefox plug-in when you install it. That works and allows you to add files to the playlist using simple javascript. I made a demo which plays, stops, goes to next track and pauses the music. It works but then the next problem would be how to make the .it or .xm or .mid or .mod file on the fly using the server. Would that be done using a batch command run from php or could it be made using pure php. This would be faster than creating wave or mp3s on the fly and uploading them.
Here is a link to VLC's wiki talking about how to make the embeded object work in firefox and controlling it using js.
http://wiki.videolan.org/Documentation:WebPlugin#Playlist_object

Then I thought this was not really good either since its using old technology and when I refreshed the page it would crash the plugin too. I found a new way to run midi type files in firefox at least and maybe Chrome, Safari or Opera which use webkit.

I found this site:
http://weare.buildingsky.net/processing/audionode.js/examples/index.html
The top example works sort of:
http://weare.buildingsky.net/processing/audionode.js/examples/drum-machine.html
It uses javascript and html5's audio object to create audio from scratch like wave files.
https://wiki.mozilla.org/Audio_Data_API

You tell it what the sample rate is and then feed it all the data in an array. 44100 samples per second is the normal rate. Its the quality of CD's and it seems to work. There is a website I found which converts .midi files to wave channels on the fly in javascript on the client and plays them using firefox.
http://jsspeccy.zxdemo.org

It will take time to learn how to use this to make a cool sequencer program all on the web but it looks like it would be possible. I just need to know how to make sounds either wave files or how to make track files and then convert them to wave files to play in the browser. Its easy to make a simple sine wave but how do you introduce other sounds into the mix?

Sunday, November 6, 2011

Get amazon ASIN using javascript

I was wondering how this can be done and found a couple answers on: http://stackoverflow.com/questions/1764605/scrape-asin-from-amazon-url-using-javascript
url = window.location.href;
url.match("/([a-zA-Z0-9]{10})(?:[/?]|$)");

Monday, October 31, 2011

Hierarchy in databases for folders

I have been building a folder system that stores files and revisions to these files in the folders. I have now added deleting the folders or files by turning a column isDeleted = 1 or 0 when it is deleted so I can keep them in side until a certain time has gone by before moving them to an old table or delete them.
It was made for a comment system but I converted it to show the folder structure by building an unordered list for each root node and using lots of DIVs and spans with CSS to show the mini folders with plus and minus signs that will hide or unhide the inside list to show or hide a list of folders. This works for many levels. Then I made 2 columns on the right of the tree structure that shows 2 levels of the folders at any point. Then by clicking on any folder in the 2nd column it moves to the first column and shows the files and folders that are in it, in the second column or just a blank folder and file icon to allow you to add new folders and files. I also implemented a right click menu to add or remove files and folders. Then I made the folders and files draggable so we can move them to other folders either in the tree on the left or another folder in one of the 2 columns we navigate in. 
Now the problem I have to solve is how to keep them in order when I move a folder to another place. My folder tree walker fails to build the tree when it reads the table from top to bottom because I moved the folder above the point where the parent is so when it tries to find the parent for the child folder I moved it can't find it because the child it mentioned before the parent is listed in the database. I need to make a column that lists the tree in order from the root nodes out to the children. I have to do this because I don't want every person that views the page to have recursively find all the nodes since this won't scale well. I have to redo the order of the folders each time a new folder is added or a folder is moved. 
about a way to make adding a folder easy. It uses a lineage column that lists all the ids from the root to the present like 1-4-8 and when you add a child to 8 you will just add "-9" to the 9th folder in the system that's being placed inside the 8th folder. If I use this method then when I move a folder with many folders inside then I need to rewrite the lineage for each folder recursively using the parent of the folder it is being placed in as the base for the new location the folders are being moved to. 
Then I read this article: http://evolt.org/node/4047/
It mentions another way of fixing this by running a stored procedure when you insert a new folder where all folders after it it incremented by 1 id.
talks about other methods of working with this data. I am going to try pulling all the data out of the database using a single select and then build the tree in php and then update the sequence in the database afterward. I can do this each time a folder is moved.

Monday, October 24, 2011

Google Docs spreadsheet automatic email sending


This script sends an email using google docs spreadsheets.
Here is a script I made that sends an email to people if a cell doesn't say email sent. It uses cells that exist to put together the body and subject of the email. You can do alot more with this but its good enough to work.


function sendEmails2() {
  var sheet = SpreadsheetApp.getActiveSheet();
  var startRow = 2;  // First row of data to process
  var numRows = 10000;   // Number of rows to process
  // Fetch the range of cells A2:N10000
  var dataRange = sheet.getRange(startRow, 1, numRows, 14)
  // Fetch values for each row in the Range.
  var data = dataRange.getValues();
  for (var i = 0; i < data.length; ++i) {
    var row = data[i];
    var emailAddress = row[6];  // First column
    var message = row[12];       // Second column
    var emailSent = row[13];     // Third column
    if (emailSent != EMAIL_SENT) {  // Prevents sending duplicates
      if(emailAddress.length == 0){
        //sheet.getRange(startRow + i, 15).setValue("stop");
        break;
      }
      var subject = "Sending emails from a Spreadsheet";
      MailApp.sendEmail(emailAddress, subject, message);
      sheet.getRange(startRow + i, 14).setValue(EMAIL_SENT);
      // Make sure the cell is updated right away in case the script is interrupted
      SpreadsheetApp.flush();
    }
  }
}

Friday, October 21, 2011

Excel Indirect function

I just used Excel today to make some reports and this is a simple form or the function I made:

=INDIRECT("'" & D4 & "'!" & C4)

If you put the values from D4 and C4 into their places it looks like this: =INDIRECT("'test'!a1").
What this does is print what ever is in A1 of the test sheet. What is nice is it looks at a cell in the spreadsheet to choose the sheet to look for values in. So you could have a dropdown box show a list of the sheet names that you get from a settings sheet that you update each time you add a sheet. Then you can make reports that will update for you every time you change what is in the dropdown menu. I also use vlookups to lookup exactly what ranges to use in the dynamic indirect function. That way you can put most of the function code in one place in the table that the vlookup looks at instead of putting all the index or match function text in every place that uses the indirect function. I was having the vlookup table calculate what row each section start of stops so we can do a count of cells within that section from the indirect function without all the overhead that the vlookup table does.

Tuesday, October 11, 2011

Shared online Tracker like Google Docs


I thought of a cool idea for a collaborating tracker.
How hard would it be to make a shared online tracker where every note you add to the tracker I see on my version of the online program as if we were both on the same computer.
Its like google docs for music trackers.
The tracks would have to be able to be encoded and decoded fast and compressed and sent accross the net or peices of the file to tell the other collaborators that are using it right now what changed. Like ajax in an online or off line tracker program.
If you like this idea then comment.

Thursday, October 6, 2011

New ways of hacking websites

What if someone could send you a link to their page and in that page it could make you post a form that you can't see. This form could send money from the bank account they are logged into to the attackers account. All they have to do is send them to the right page and with the right parameters sent along it will send the money to the attacker. There are a couple ways of fixing this. The bank could use a token that can only be used once along with other parameters int he form that have different values everytime so the attacker wouldn't know what the names of the hidden fields are without going to the banks website and getting their form. If they could use PHP curl request with the banks sessionid it would be relatively easy to get the form contents and then fill in the right values into it and send the form off to the bank website and they would think it was from them. They would also use curl to not only send the sessionid but also change the referer to say it came from the banks website page where the form is. That page could also be a unique url everytime as well. Then the curl request would need to know what page to download the form. They would go to the page where the user clicks to get the form and it would create the unique url for the form there so the attacker may get the form that way. How does the attacker get the sessionid? They use javascript to somehow run document.cookie on another tab than the one they are on now. If this works then they have the sessionid and can then refresh the page quickly after the js is done getting the sessionid and once it has refreshed the page will run php code to make the curl request to the page where the bank website is. This could be any website that has forms. This is just an example with a bank to show how important it is for websites to secure their sites using some of these techniques or others. Another thing the bank website can do to make it hard to run their form without being on their site is using dynamic named functions in php. Use the create_function function in PHP to make a custom custion that is written alittle bit differently each time in a way that ensures the user is logged in:
http://php.net/manual/en/function.create-function.php
But if the hacker has your sessionid I don't know how this will be good enough. Here are some interesting pages on the subject:
http://4diggers.blogspot.com/ 
Here is an article about cross domain ajax and how cross domain ajax could break any web application http://shiflett.org/blog/2006/aug/cross-domain-ajax-insecurity

Sunday, August 28, 2011

image test to local site


Reading a php page with only an image is a method a hacker could use to get your cookie info if they could get that image tag onto a secure site or blog. &amp;lt;br /&amp;gt; &amp;lt;img alt="no image" src="http://stokescomp.com/sample/test.php" style="display: none;" /&amp;gt;

Monday, August 22, 2011

Error when trying to use JSON and jquery libraries together

For the fix for this just use json2.js instead of json.js:
https://github.com/douglascrockford/JSON-js
The problem was that he was replacing the json function in the object.prototype and this breaks jQuery since this is not a very good idea. The new json2.js is much better. Below is the troubles I was having and how I solved it with the json.js but later I ran into other things that was broken in jQuery because of json.js. So just use json2.js instead.
I got this error when I had both json.js and jquery scripts in the same html file:
JSON.parse: unexpected character So I tried updating to the newest jquery 1.6.2 and I got this error: c.replace is not a function
I spent a couple hours trying to track it down.
I noticed that when I leave out the json.js file there are no errors when running any jquery code.
First I looked in json.js and found the lines that made it fail.
In json.js it has this code at the end to actually make the parseJSON function if it doesn't exist:

if(!Object.prototype.toJSONString){
Object.prototype.toJSONString=function(filter){return JSON.stringify(this,filter);};
Object.prototype.parseJSON=function(filter){return JSON.parse(this,filter);};
}}());


Now I tracked this down to the exact part of the jquery code that was causeing the problem.
There is a function called by(a,c) in the jquery file. The variable c had these values:
paddingLeft
paddingRight
opacity
function (filter) { "use strict"; return JSON.stringify(this, filter); }
When it got to the function here it fails since thats not a string but a function that was created using JSON's Object.prototype.toJSONString=function(filter)
I don't know why the function is in this list of css types. To fix it I replaced:
c=c.replace(bp,"-$1").toLowerCase();
with:
c=c.toString().replace(bp,"-$1").toLowerCase();
the toString changes the function to a string.
Then when I run the code it gets to the json function and tries to pass an object to json so I fixed it like this:
Object.prototype.parseJSON=function(filter){if((typeof filter) == 'object') return;return JSON.parse(this,filter);};
This checks if its an object instead of the expected string and returns nothing if thats the case.
I don't want to spend more time trying to figure out the root problem but this hack will make it work for now.

Neat asynchronous uploads

I am letting people upload multiple documents at a time to be added as revisions to existing documents. If the file name matches it shows them the revs that exist.
While they enter a description for the files the upload moves the files to a temp folder:
I move the files asynchronously using a hidden iFrame and a target on the form pointing to the name of the iFrame. The php thats echoed there includes js that will change a button from loading to Open for each file so they can open pdfs from the files temp location.
Without refreshing I upload the document and allow them to open it while its in a temp folder on the server. Then when they have finished adding a description for it then the file is moved to the real folder where all the other files are. The database has a hierarchical table that shows where in the virtual folders for these files are even though they are in the same folder in the physical server.

Sunday, August 14, 2011

XMP tags

I found out recently about a tag in html I didn't know about called XMP. They make it so all the code that you put in them is shown and the browser won't interprit them as html. Here is an example:

<p>testing a paragraph</p>

PHP Daemon runs out of file resources

http://gnuvince.wordpress.com/2008/10/28/php-wrong-for-long-running-processes-wrong-for-america/

<?php
$fd = fopen('/etc/passwd', 'r');
echo "$fdn";
fclose($fd);

$fd = fopen('/etc/fstab', 'r');
echo "$fdn";
fclose($fd);
?>


And this shows the usual:
$ php fds.php
Resource id #5
Resource id #6

Python doesn't have this problem though.

PHP is reusing the file descriptors but counting up its file resource. When it gets to 2^31-1 files and then goes into negative numbers and when it gets to 0 it crashes. How can the process use that many file handles in a few weeks time?

How do you reuse old file descriptors or resources after they are closed so you can run the php script forever?

Tuesday, August 2, 2011

Clearing multiple setTimeouts with js

http://garbageburrito.com/blog/entry/555/slideshow-clearing-all-javascript-timers
I was making timers and was having trouble clearing them since if you use the same variable to save each timer and you use clearTimeout(timer); it only clears the last timer and not all of them. You can't just call clearTimeout 3 times to clear them. So I found this col code to put setTimeouts into an array and clear them before you set more.

Make many timers and clear them any time.
<script>
timers = new Array();

function resetTimeouts() {
timers = new Array();
}
function clearTimeouts() {
for (var i= 0;i < timers.length; i++) {
clearTimeout(timers[i]);
}
//resetTimeouts();
timers = new Array();
}
//stop any timer
clearTimeouts();
timers.push(setTimeout("alert('timer here');", 2000))
</script>


Then if you make many timers and then you make more you want to clear all the old ones each time you make more so the old ones aren't triggered after new ones are made.

HDs prices have dropped

3TB Hard drives are now $130 on newegg.com
Thats the cheapest I have seen. This is 4.3 cents a GB and the cheapest I knew about before was 5cents a GB.

Wednesday, July 6, 2011

VBA code for copying range of cells in excel

I helped someone make a copy of some cells in an excel spreadsheet using VBA. Thy were adding a recipe to another worksheet.

'move to the AddRecipes tab
Sheets("AddRecipes").Select
'select the range of recipe ingredients and then copy the selection.
Range("C11:C30").Select
Selection.Copy
'select the dessert sheet
Sheets("DessertIngredients").Select
'select the range and then paste there using the dynamic variables in the for loop
Range(Cells(Row1 + 1, Column1), Cells(Row1 + 21, Column1)).Select
ActiveSheet.Paste