Wednesday, April 21, 2010

Using the QTKit Framework

From here: http://developer.apple.com/quicktime/qtkit.html


The heart of QuickTime is its comprehensive underlying framework which is powerful, extensible, and flexible. This framework provides developers with the ability to display, import, export, modify, and capture more than 200 different media types. Until recently, however, using this power from Cocoa applications hasn't always been straightforward. Before the release of Mac OS X Tiger, anything more than display and playback of QuickTime files required using a set of Carbon APIs that were distinctly foreign to most Cocoa developers.
That has all changed. With Mac OS X Tiger comes QuickTime 7, which features a redesigned core architecture and provides a modernized Cocoa interface called QTKit. QTKit allows Cocoa developers to leverage a useful subset of QuickTime's capabilities. It not only allows you to play QuickTime movies, but to edit, splice, combine, and transcode them. And, if you need to go beyond its abilities, QTKit makes it easy to get to the underlying QuickTime primitives and directly use the more than 2500 functions in the QuickTime procedural API.
In essence, QTKit brings a deeper level of integration with QuickTime to the premier programming environment on Mac OS X.
This article shows how the QTKit framework is structured and introduces you to the essential concepts you'll need to understand to get up and running. First, let's review why QuickTIme is so important and what it brings to developers.

QTKit API Overview


For more info see the link above.


What Can You Do With QTKit?

With just the overview of QTKit that we've given here, you can see that QTKit lets you access an enormous amount of power from QuickTime and build it into your application in a straightforward fashion. What can you do with this knowledge now? You could create a media browser that would let you keep tabs on all the various kinda of meta-data about a large collection of QuickTime movies. You could build a command-line tool that would grab several frames from a set of movies and make a web page that allowed users to browse a collection remotely and choose the movie they wanted to download. Or, you could even build the next video editing tool customized for your own internal workflow.
The sky is the limit. QTKit brings an unprecedented ease of development to more than 15 years of multimedia experience in the QuickTime platform. It brings the premier multimedia platform to the premier application creation platform.

For More Information on QTKit

Using this article as a springboard, you should be able to dive into code and, with the help of the documentation, create your own QuickTime based Cocoa application. Along the way, you'll want to take advantage of the following resources:

Mac automation resources

Best to my view resources about Mac Automator and Applescript:

http://www.automatedworkflows.com
http://automatoractions.com
http://automatorworld.com
http://macscripter.net
http://search.macupdate.com/search.php?keywords=developer:%2BRosanne%20%2BCashriel
http://www.apple.com/downloads/macosx/automator



Example workflows:
http://www.automatedworkflows.com/software/automator_actions/example_workflows.html

Tuesday, April 13, 2010

OpenUSB

http://sourceforge.net/projects/openusb
http://sourceforge.net/apps/mediawiki/pyusb/index.php?title=Main_Page

Анализатор USB траффика от компании LeCroy:

http://www.lecroy.com/ProtocolAnalyzer/ProtocolStandard.aspx?standardID=4&capid=103

Hashtable thread safety

Hashtable is thread safe for use by multiple reader threads and a single writing thread.
It is thread safe for multi-thread use when only one of the threads perform write (update) operations, which allows for lock-free reads provided that the writers are serialized to the Hashtable. To support multiple writers all operations on the Hashtable must be done through the wrapper returned by the Synchronized method, provided that there are no threads reading the Hashtable object.

Enumerating through a collection is intrinsically not a thread safe procedure. Even when a collection is synchronized, other threads can still modify the collection, which causes the enumerator to throw an exception. To guarantee thread safety during enumeration, you can either lock the collection during the entire enumeration or catch the exceptions resulting from changes made by other threads.

Synchronized supports multiple writing threads, provided that no threads are reading the Hashtable.
The synchronized wrapper does not provide thread-safe access in the case of one or more readers and one or more writers.

Hashtable myCollection = new Hashtable();
 
//... multiple thread usage via Hashtable.Synchronized(myCollection);
lock(myCollection.SyncRoot) {
  foreach (Object item in myCollection) {
  // ... here is reading operation
  }
}

Mac automation


AppleScript is a powerful scripting language that comes built-in to OS X. The principal use for AppleScript is the automation of tasks that are normally repetitious and time consuming. For instance, as a freelancer, I hate creating invoices every week for my various clients. To solve this problem I wrote an AppleScript that reads the hours that I log into iCal, creates an invoice in Microsoft Excel based on those hours, and emails the invoices to my clients. All with the click of a button!
The best part about AppleScript is that you don’t have to be a genius programmer to use it. In fact, you don’t have to have any programming experience whatsoever. This article will show you how to write an AppleScript for nearly any application using the simple instructions that come hidden within each app’s framework. Intrigued? Read on!
The Main Window
The Main Window

Getting Started: The Tell Block

To create an AppleScript, open the application “Script Editor” located inside the AppleScript folder within the Applications folder. You should see a simple window containing a large text field with a strip of buttons along the top. Inside the text field type the following code:
1
2
3
4
5
tell application "Finder"
 
 display dialog "Hello World"
 
end tell
AppleScript attempts to use plain English wherever possible to make coding extremely simple. Most commands in AppleScript are located inside a “tell block”. It’s called a “tell block” because you are “telling” a given application what you want it to do. For instance, the code above is telling the Finder to display a dialog window containing the words “Hello World”. After you are finished with a command or string of commands for a given application, you end the block with “end tell”.
Always remember to end your tell blocks correctly or the code will not compile!
After you are done entering the code above, click on the “Compile” hammer icon. If your syntax is correct, your code will automatically format and colorize. If you have made an error, Script Editor will highlight the problematic area and give you a message about what it thinks might have gone wrong. Here is a quick reference to the various colors you’ll see in your compiled code (found in Script Editor>Preferences).
Color Guide
Color Guide
After your code has compiled, click on the “Run” button. You should see the following dialog:
Hello World
Hello World
Now click the “OK” button and look at the bottom of your Script Editor window. When you run a script, Script Editor tells you what the result was, or what was “returned”. In this case it’s telling you that the “OK” button was clicked.
The OK Return
The OK Return

Declaring Variables

Variables are essentially the same in every programming language. They provide an easy way to access and manipulate lots of information in a compact snippet of code. Creating or “declaring” variables is different for every language. In AppleScript you declare variables as follows:
1
2
3
4
5
6
7
set theString to "Hello World"
 
tell application "Finder"
 
 display dialog theString
 
end tell
There are several things to note about the previous example. First, notice that variables are declared using the “set” and “to” commands. By doing this you are setting your variable name, in this case “theString”, to equal something, in this case the text “Hello World”. Many programming languages require that you state the type of variable you want in the declaration (integer, floating point, text, etc.). AppleScript however, is intelligent enough to work with your variables without any instruction about the format.
Also notice how I typed my variable name. You can’t have spaces in a variable name so it’s good practice to use camel case (theString) or the underscore method (the_string). It doesn’t really matter which method you choose, just make sure you’re consistent throughout your code. It’s also a good idea to give all your variables meaningful names. When you are looking another programmer’s code, it can be annoying to see variable names like “myVariable” that don’t give any indication as to what they are or what they will be used for.
Finally, notice that now that I’ve placed the text “Hello World” inside a variable, I can call that variable again and again throughout my code. Then if I later decide to change the text “Hello World” to “Good Morning Dave”, I only have to change the text on the line where I declared the variable.

Working with Variables

You can do all kinds of crazy things with variables, but since this is only meant to be a brief introduction to AppleScript, I’ll just show you a few. Type in the following code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
--Integer Variables
set theFirstNumber to 3
set the theSecondNumber to 2
 
--Variable Operations
set theAnswer to (theFirstNumber + theSecondNumber)
set theAnswer to (theAnswer + 1)
 
--String Variables
set theString to "3+2+1="
 
--Display Dialog
tell application "Finder"
 
 display dialog theString & theAnswer
 
end tell
You can compile your code quickly by pressing the “enter” key (not the return key). This is located on the ten key number pad on desktop computers and next to the “Command” key to the right of the space bar on laptops.
As your script becomes more complex, a bit of organization is in order. By typing two dashes “–” before a line of text, you can insert a comment. Use comments to separate and describe your sections of code for easy navigation. In this example I’ve created a string variable (text only) and a few integer variables. Notice that you can perform mathematical operations on variables. Here I’ve set “theFirstNumber” to equal three and “theSecondNumber” to equal two and then added them together in “theAnswer”.
Also notice that you can change a variable after it is declared. Immediately after setting “theAnswer” to the sum of “theFirstNumber” and “theSecondNumber” (resulting in 5), I changed the value of “theAnswer” by adding one to it (resulting in 6). If you run this script you should see the following result:
Some Basic Math
Some Basic Math
Again, this only scratches the surface of the kinds of operations you can perform on variables. For now you should just understand that a variable isn’t static. Much of the power of behind any programming language is the ability to manipulate variables to perform a wide variety of tasks.

The Key to it All: AppleScript Dictionaries

Though AppleScript itself has a wide range of commands that can be applied to any program or item in OS X, the developers of each application are tasked with adding full AppleScript support to their apps. What this means is that developers must write simple manuals for how to communicate with their applications through AppleScript. These manuals are called “Dictionaries”. To view a dictionary, go to File>Open Dictionary in Script Editor. Scroll down the list of applications, click on Mail and hit “OK”. You should see the following window:
The Mail Dictionary
The Mail Dictionary
The column on the left contains the available “Suites” of commands and items. When you click on a suite, you’ll see everything contained in the suite displayed below. You can narrow this preview by clicking in the second column, then again in the third. Suites contain commands (C with a circle) and classes (C with a square), classes contain properties (P) and elements (E). To understand how all this works, let’s use this dictionary to create a script.

Create and Algorithm for Our Script

First we need an algorithm, which is a fancy way to say that we need write down exactly what our script will do. We want to create a script to compose and send an email. We’ll want to use variables to make it easy to change the message itself as well as who the message is sent to. As we write our algorithm, we need to keep in mind the way AppleScript works. Here are the steps I came up with:
  1. Create variables for the recipient, the recipient’s email address, the subject of the email, and the text for the body of the email.
  2. Create a variable that holds our new message along with its various properties
  3. Create the new message
  4. Send the new message

Creating Simple Variables

We already know how to create variables holding text so we don’t even need the dictionary for step one. Here’s what the code looks like:
1
2
3
4
5
--Variables
set recipientName to "John Doe"
set recipientAddress to "nobody@nowhere.com"
set theSubject to "AppleScript Automated Email"
set theContent to "This email was created and sent using AppleScript!"
As you can see, we’ve just put placeholder text into the variables for the name and email address of the recipient as well as the subject and content of our message. You can change these to anything you’d like. Be sure to put your own email address in the recipientAddress variable so you can ensure that the the script is working properly when you receive the email.

Creating the Message Variable with the Mail Dictionary

Since we have no idea how to tell Mail to create a new message, this is where we need to refer to the AppleScript dictionary. If you click on “Standard Suite” you’ll see several common commands that come standard in AppleScript. Knowing that we want to “create” a new message, we just scroll through the options and find something equivalent. You’ll see there is no “create” command but about half way down there is a “make” command. That sounds perfect, so we now know to tell AppleScript we want to “make” something.
Next click on the “Mail” suite. We’ve already got our command (make) so scroll down past the commands (verbs) until you see the classes (nouns). The first class we come across is “outgoing message”, which is great because that’s exactly what we want! Now click on the “outgoing message” class and look at the available properties down below.
We need to plug in our variables for the recipient’s name, the recipient’s email address, the subject, and the contents of the message. In the list of properties there isn’t anything about the recipient but there are properties for subject and content. We now know the proper syntax to refer to these properties. Notice that the dictionary gives you the format to define the properties. For instance for the subject, we’ll type the word “subject” followed by a colon followed by the text of the subject.
Subject Content
Subject Content
Also in this suite you’ll find a “send” command, which we can use to send the message by simply typing “send”. We still need to know the proper syntax for the recipient’s name and email address. Since it’s not in this suite, click on the “Message” suite. About halfway down the list of classes we find “recipient”. Click on the recipient class and we see that once again, we can use plain English to refer to the properties of the recipient. We’ll simply type “name” and “address”.
You can use the search feature to hunt down properties, classes, elements and commands quickly.
Now we are ready to create our message variable using the syntax we’ve just learned. Here’s what the code looks like:
1
2
3
4
5
6
7
8
9
10
11
12
13
--Variables
set recipientName to "John Doe"
set recipientAddress to "nobody@nowhere.com"
set theSubject to "AppleScript Automated Email"
set theContent to "This email was created and sent using AppleScript!"
 
--Mail Tell Block
tell application "Mail"
 
--Create the message
set theMessage to make new outgoing message with properties {subject:theSubject, content:theContent, visible:true}
 
end tell
Notice I’ve created a tell block to enclose all the commands to the Mail application. Then I set a variable (theMessage) to “make” a new “outgoing message” with the properties discussed above. Also notice that sets of properties are always contained in brackets { }.

The Final Step: Setting the Recipient and Sending the Message

Now that we’ve created our message variable, we need to call that variable and create a new message with the properties of theMessage. We also need to set the recipients and send the message. To do this, we’ll use a tell block on our variable. Here’s our finished script.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
--Variables
set recipientName to "John Doe"
set recipientAddress to "nobody@nowhere.com"
set theSubject to "AppleScript Automated Email"
set theContent to "This email was created and sent using AppleScript!"
 
--Mail Tell Block
tell application "Mail"
 
 --Create the message
 set theMessage to make new outgoing message with properties {subject:theSubject, content:theContent, visible:true}
 
 --Set a recipient
 tell theMessage
  make new to recipient with properties {name:recipientName, address:recipientAddress}
 
  --Send the Message
  send
 
 end tell
end tell
First, we created a new copy of theMessage (which inherits all the properties we’ve put into it) and set it “to recipient with properties”. This tells Mail that we want to add a recipient with the following properties. Here we just used the syntax we learned before and the variables for the name and address of the recipient.
Finally, we invoked the “send” command to send our message. Notice that we have two tell blocks to close this time. Once you’ve compiled your code and fixed any errors hit the “Run”. Mail should automatically create and send the message. Tadaah! Check your sent folder to make sure everything worked.
Mail Message
Mail Message
Congratulations, you’ve created your first AppleScript! You can save it as a simple script that you can come back and edit or as an application that runs automatically when you open it.

Conclusion: Keep Learning

I hope this beginner’s guide has you thinking about all kinds of processes and tasks you’d like to automate. The syntax I’ve shown you along with the AppleScript Dictionaries will get you a long way. However, if you’re really interested in implementing AppleScript in a number of useful ways, you’ve got more reading to do. Apple provides lots of information all about AppleScript on their website. Here’s a good place to start.
Another website I’ve picked up a great deal from is T&B. It offers some really in-depth explanations and tutorials for you to follow (a little dated, but thorough and free). Please feel welcome to leave a comment and let us know if you found this tutorial helpful! What other AppleScript tips would you like to see covered in the future?

Related Posts

Powered by Blogger.