JSON – A cool way to transfer data!

One of the enhancements in NS Basic/App Studio 1.2.4 was the addition of JSON support. If you want the full details on what JSON is, read about it on Wikipedia. For our purposes, it is a fast way to wrap up a bunch of data up so it can be transmitted or received.

Using JSON, you can take a data structure or a complete SQLite database and turn it into a string which you can send to another system using HTTP POST or WebSockets. You can also receive a string the same way, which you can then turn into active data in your program or save to SQLite. You can also use JSON to encode a database which can then be installed with your app. Your app can read it in and construct the database.

It’s fast. We did a benchmark where we created an SQLite database with 20,000 customer address records. Exporting that database to JSON on an iPhone 4 took just over 1.1 seconds. Importing 1,000 records to a new database took 2.2 seconds. Tests on an Android Nexus S were also fast: import in .851 seconds and export of 20,000 records in 3.8 seconds. It’s quite practical to use on large files.

Here is how to export an SQLite database using JSON:

Function JSONExport()
  Dim i
  recs=DBRecords.rows.length
  Dim data(recs)
  For i=0 To recs-1
    data[i]=DBRecords.rows.item(i)
  Next
  JSONExport=JSON.stringify(data)
End Function

What this code does is to copy the database into an array, with one element for each row of the database. The JSON.stringify() function converts it all to a JSON string.

Here is some code which imports an SQLite database:

Function JSONImport()
  Dim data, sqlList, q
  file=ReadFile("customers.json")
  data=JSON.parse(file.responseText)
  DB = SqlOpenDatabase("customers.db","1.0","My Customer Database")
  q=Chr(34)
  If DB<>0 Then
    sqlList=[]
    sqlList[0]=["DROP TABLE customerData;",,skipError]
    sqlList[1]=["CREATE TABLE IF NOT EXISTS " & "customerData('name', 'address1', 'address2', 'age', 'sales', PRIMARY KEY('name') );"]
    
    For i = 0 To UBound(data)-1
      Name    = q & data[i].name & q
      Address1= q & data[i].address1 & q
      Address2= q & data[i].address2 & q
      Age     = data[i].age
      Sales   = data[i].sales
      s = Join([Name, Address1, Address2, Age, Sales],",")
      sqlList[i+2]="INSERT INTO customerData (name, address1, address2, age, sales) VALUES ( " & s & ");"
    Next
 
    sqlList[i+2]=["SELECT * from customerData ORDER BY name;", dataHandler]	  
    Sql(DB, sqlList)
  End If  
End Function

The ReadFile in the third line is interesting. “customers.json” is a file that is included in the project’s manifest and deployed with the project. ReadFile() reads the entire file in.

The fourth statement does all the work. It takes the data that was read in and turns it into an array, with one element per row. From there, it is straightforward to process it and add the records into the SQLite database.

You can try this sample out: it is called SqlSample1, and it is installed with NS Basic/App Studio starting with 1.2.4.

If you are curious about the format of the JSON file, here’s a sample:

[{"name":"Customer0","address1":"0 Winding River Lane","address2":"Anytown USA 100000","age":32,"sales":56025},{"name":"Customer1","address1":"1 Winding River Lane","address2":"Anytown USA 100001","age":75,"sales":86082},{"name":"Customer10","address1":"10 Winding River Lane","address2":"Anytown USA 1000010","age":23,"sales":52976},{"name":"Customer100","address1":"100 Winding River Lane","address2":"Anytown USA 10000100","age":87,"sales":26473},{"name":"Customer101","address1":"101 Winding River Lane","address2":"Anytown USA 10000101","age":10,"sales":45455},
...

The data is represented as an array, with one element for each row of the array. Each element is made up of a list of fieldnames in quotes and values. String values are in quotes; number values not.

NS Basic/App Studio 1.2.4 Released!

NS Basic/App Studio 1.2.4 is ready to download. You can download it from the same URL as before. We will also be sending an email with the address to registered users.

There are a few nice new features:
– Lots of right click features in the Design Screen
– JSON support for data interchange
– Faster deploying
– Lots of fixes and usability improvements

1.2.4

  1. JSON support added. See docs below.
  2. Design Screen: Right click on a control brings up lots of options.
  3. Properties Window: Now remembers folder settings on restart.
  4. Controls: Button is now square with rounded corners. See docs below.
  5. Deploy: Faster, since only files actually used are deployed.
  6. Code Window: Sleep 5000 no longer hangs IDE for 5 seconds.
  7. Code Window: Problem with indenting fixed.
  8. Code Window: Resume is no longer highlight.
  9. Controls: HTMLview now scrolls properly.
  10. Deploy: 550 error on some servers fixed.
  11. Deploy: If serial number is removed, deploy still works.
  12. Demo Screen: PayPal button added.
  13. Design Screen: Fix problem with pasting multiple copies of a control.
  14. Design Screen: Right click on a control brings up options.
  15. Docs: Handbook and Language Reference updated.
  16. IDE: Improved demo screen.
  17. IDE: Deploy password now encrypted.
  18. Language: DIM array can now have any number of dimensions. (Thanks to Thomas Gruber!)
  19. Language: New functions – JSON.stringify(), JSON.parse().
  20. Language: New statement: Sleep
  21. Runtime: Added BlackBerry to supported device browsers.
  22. Samples: SQLSample1 now uses JSON to output SQLite database.
  23. Samples: MiniDataServer is an alternative to WebSockets. (Thanks to Robert Borsuk!)
  24. Samples: New GoogleReverseGeocoding sample.
  25. Samples: ReadFile uses updated HTMLview.
  26. Translator: ‘f = FactCalc()’ was not always translating properly.
  27. Translator: ‘Function test(p) one’ no longer hangs IDE.
  28. Translator: Dim(10,10,10) was not creating all elements.
  29. Translator: Typename(“12345a”) returned Integer, not string.
  30. Translator: Dim(a.b) is now allowed.


Documentation Changes for Version 1.2.4

  1. Make sure you do a full deploy the first time you run the new version.

  2. JSON is now supported. JSON is a standardized way of converting objects to strings so they can easily be saved or transmitted to other systems. For example, you could convert an SQLite database to JSON, then transfer it to a server using WebSockets or HTTP POST. The server would then unpack it and process it.

  3. Buttons now look more like standard iOS buttons. The edges are now straight: just the corners are rounded. Any new buttons you create will have the new look: to upgrade old buttons to the new look, enter nsbbutton into the class property of the button in the IDE. To keep the old appearance, leave the class property blank. Be sure to do a full deploy to see this change.

NS Basic/App Studio 1.2.3 released!

NS Basic/App Studio 1.2.3 is ready to download. You can download it from the same URL as before. We will also be sending an email with the address to registered users.

There are a few nice new features:
– New List controls
– jQuery sample
– Scrolling enabled for more controls
– Lots of fixes and usability improvements

1.2.3

  1. Controls: New MenuNumberTitleDescArrow (see docs below)
  2. Controls: New MenuNumberTitleTime (see docs below)
  3. Controls: New MenuTextBlock (see docs below)
  4. Samples: New jQuery sample.
  5. Samples: New BarCode reading sample.
  6. Code Window: Shortcuts: Ctrl F for Find, Ctrl G for Find Next.
  7. Code Window: Multi line statements are syntax checked correctly.
  8. Controls: Grid scrolling improved.
  9. Controls: MultiInput and Menu now support scrolling.
  10. Docs: Handbook and Language Reference updated.
  11. Deploy: Extra MKD operations removed: deploy speed improved.
  12. Deploy: Improvements to error messages.
  13. Language: New bitwise functions: ANDb, ORb, XORb, NOTb. See Language Reference.
  14. Project Explorer: right click to move and delete controls.
  15. Project Explorer: Problem with deleting all forms fixed.
  16. Properties Window: Return no longer needed to save changed value.
  17. Runtime: “UpdateReady” cache message now reads “Update Complete – Restarting”
  18. Runtime: Global code is executed before first form shows.
  19. Runtime: iScroll.js updated to 4.1.2
  20. Runtime: Removed some unneeded image files.
  21. Samples: Communicating: Add Skype calling as an option, refresh screen.
  22. Samples: New BarCode reading sample.
  23. Samples: New GridWithScrolling sample.
  24. Samples: New MenuNumberTitleDescArrow, MenuNumberTitleTime, MenuTextBlock samples.
  25. Toolbox: Controls are now in alphabetic order
  26. Translator: Replace(s,”)”,””) fixed.
  27. Translator: a=Log(1) fixed.
  28. Translator: a=5.1 mod 3.1 fixed.
  29. Translator: a=[{b:1}] fixed.
  30. Translator: t[1,(1) Mod 2] fixed.


Documentation Changes for Version 1.2.3

  1. MenuNumberTitleDescArrow: This new control shows a number (or word), title, optional description and an arrow. See Language Reference for more details.

  2. MenuNumberTitleTime: This new control shows a number (or word), title and optional time. See Language Reference for more details.

  3. MenuTextBlock: This new control shows blocks of text and an arrow. Useful as a preview of text. See Language Reference for more details.

Using Facebook with NS Basic/App Studio

It’s easy to get Facebook information into your NS Basic/App Studio program. Facebook has an API that is easy to access. Send a message to it, and it will return the information you requested.

Here’s how to request information on Mark Zuckerberg:

$.getJSON("https://graph.facebook.com/MarkZuckerberg", "callback=?", gotJSON)

A bit of explanation is in order.
The $.getJSON() function is in an external library named JQuery. JQuery is a very popular library for JavaScript developers. Fortunately, it can be called from NS Basic/App Studio quite easily. Simply put the following into your project’s “extraheaders” property:

<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.6.0/jquery.min.js">
</script>

(You could also download the file jquery.min.js into your project’s directory and add it to your manifest.)

The getJSON call has 3 parameters: the URL to get information from, any parameters to send to the URL, and the return function. In this case, we want to get information about Mark Zuckerberg.

When it comes back, we want the function gotJSON to be called on our program. This is an asynchronous operation: your program can continue to run while we wait for graph.facebook.com to reply. When it does, our function is called.

Here is what gotJSON looks like:

Function gotJSON(data)
  If data["error"] Then
    txtData.value = data.error.message
  Else
    txtData.value = ""
    For Each index, item in data
      txtData.value = txtData.value & index & ": " & item & vbCRLF
    Next
  End If
End Function

The data is returned as a JSON object, which ) is a lightweight text-based open standard designed for human-readable data interchange. What’s left to do is to display the object. Taking advantage of For Each’s ability to iterate both the names and the values of each member of the object, we output one line for each member. Here is the output:
facebook

For more information on the Facebook API, see http://developers.facebook.com/docs/reference/api/.

Congratulations, Marcus!

James, Marcus and George at Marcus's wedding. Marcus jams

Marcus, one of the key guys here, got married on the weekend. The picture shows James, Marcus and George at the wedding. After the ceremony, Marcus got up with his band and jammed on the saxophone. Congratulations, Marcus!

NS Basic/App Studio 1.2.2 released!

NS Basic/App Studio 1.2.2 is ready to download. You can download it from the same URL as before.

There are a few nice new features:
– Syntax checking as you enter your code.
– Grids and Picturebox controls can scroll.
– New samples for Facebook and Sencha Touch.

Here is the complete list:

  1. Code Window: Syntax checking added.
  2. Controls: Grid can scroll.
  3. Controls: PictureBox can scroll.
  4. Samples: New FacebookAPI sample.
  5. Samples: New Sencha Touch sample.
  6. Code Window: Turn off undo when setting initial text.
  7. Controls: Grid new row height is now correct.
  8. Controls: Button had invalid default property.
  9. Deploy: Error message if remote server cannot be found.
  10. Deploy: Error message shows if login info is not correct.
  11. Deploy: Error message shows if remote folder cannot be created.
  12. Deploy: Progress message improved.
  13. Deploy: Thumbs.db file ignored if in upload folder.
  14. IDE: Bug when closing minimized IDE fixed.
  15. IDE: iPhone 4 Design Screen size corrected.
  16. IDE: Problem with positioning bottom of object above top fixed.
  17. IDE: Problem with save fixed.
  18. Language: For Each index, item in Data now supported.
  19. Language: ReadFile produces better error messages.
  20. Samples: GetData sample improved.
  21. Samples: HTMLview – added display a .htm file in HTMLview control.
  22. Samples: ReadFile sample improved.
  23. Samples: WebSocket sample improved.
  24. Translator: Execute() function now works.
  25. Translator: Exit Function now returns value.
  26. Translator: If e.keyCode = 13 Then Button1_onclick() fixed


Documentation Changes for Version 1.2.2

  1. The first time you compile under this release, it will take a bit longer. Afterwards, it will be as usual.
  2. Do a full deploy the first time you run on the new release.

How to print from your app

You can print the current screen contents from your app using the statement

window.print()

For this to work from an iOS device, you will need to be connected by WiFi to a network with a properly configured printer. For example, if you are connected to a Mac running Mac OS 10.6, you can print to any AirPlay enabled printer.

While Apple has only a short list of AirPlay printers built in, almost any printer connected to the network will work if you run Air Printer Lite or Air Print Activator on the system.

jQuery Mobile 1.4 adds some extra styling which can interfere with printing a full page. Here is the workaround:

Function btnPrint_onclick()
  Dim h = Page_PrintTest.style.minHeight
  Page_PrintTest.style.minHeight = ""
  window.print()
  Page_PrintTest.style.minHeight = h
End Function

Programming Contest Results

The results of the first NS Basic/App Studio Programming Contest are in. The winners are:

Business: RMRFuel – RMR Software

This is a very real, very usable app. It should really be considered together with its 3 siblings. In fact, the author plans to create an integrated app. Since the entry was submitted, improbements have been made to the user interface. You can try the beta of the improved banking module at http://www.rmrsoft.com/RMRBank1.

Fun: Color/Shape — mizuno-ami/JAPAN

Simple, but nicely laid out. It works just like the successful Palm OS version. It has the potential for much improvement, using the user interface possibilities of the platform.

Congratulations to both the winners and other entrants. It was tough to pick the single best app!

See the full results here:
http://www.nsbasic.com/app/contest/

Update: mizuno-ami has requested his reward be sent to the Japanese Red Cross for their disaster relief efforts in Japan. 14,575 persons died, and 11,324 persons are missing now. We have matched his donation and encourage others to paypal contributions to https://gienkin.jrc.or.jp/paypal

Using Sencha Touch with NS Basic/App Studio

Sencha Touch is a JavaScript framework which can be used to add additional functionality to NS Basic/App Studio. It has a number of slick features and controls. Complete documentation is at http://dev.sencha.com/deploy/touch/docs/. One thing to keep in mind: it’s quite large, adding almost 500K to your project.

Let’s use it to create a Date Picker that looks like this:

Start by adding the Sensha .css and js files into your project folder. Add this to your project’s extraheaders property:
<link rel="stylesheet" href="sencha-touch.css" type="text/css">
<script type="text/javascript" src="sencha-touchcompressed.js"></script>

Add this to your project’s manifest:
sencha-touch.css
sencha-touchcompressed.js

Now, we’re ready to code. First thing we need to do is set up a reference to Sencha’s DataPicker object. All of Sencha’s functions are wrapped in a single object named Ext. To call any Sencha function, you therefore put “Ext.” in front of it:
datePicker = new Ext.DatePicker({yearFrom:2010, yearTo:2015})

Next, we want to tell datePicker what to do if the value of our datePicker changes. Sencha has a handy function for that: the following statement will call the showDate function in our program when this happens:
datePicker.on("change", showDate)

We’ll need a button to open the datePicker window. Add one to the project and put the following code for onclick. The first statement sets the initial date for the picker as today. The second one shows the DatePicker as a modal dialog.
Function Button1_onclick()
  datePicker.setValue(new Date())
  datePicker.show()
End Function

Now we just have to add the function that gets run if the user changes the date. We’ll just display it on the screen. An NS Basic/App Studio MsgBox statement could do this well, but since we’re showing off Sencha, let’s use their fancy one:
Function showDate()
  Ext.Msg.alert("Sencha Touch", "Date Entered is " & datePicker.getValue(), Ext.emptyFn)
End Function

Here is all the code in one listing:

datePicker = new Ext.DatePicker({yearFrom:2010, yearTo:2015}
datePicker.on("change", showDate)

Function Button1_onclick()
  datePicker.setValue(new Date())
  datePicker.show()
End Function

Function showDate()
  Ext.Msg.alert("Sencha Touch", "Date Entered is " & datePicker.getValue(), Ext.emptyFn)
End Function

This sample is included in the NS Basic/App Studio Samples folder starting in version 1.2.2.

There’s a lot more to Sencha Touch than this. If you discover any good tips or tricks, let us know so we can share with everyone!

NS Basic/App Studio Handbooks are here!

The NS Basic/App Studio Handbooks have just arrived. They are about 125 pages and spiral bound so they lie flat on your desk. PDF’s are handy, but hardcopy is always nice. It does not take up any space on your screen, and it’s easy to write your own notes on the pages.

Just $24.95 USD, plus shipping of $6.50. We ship by regular mail to North America, Air Mail to the rest of the world. Delivery is usually within 2 weeks.


handbook