kamagra soft erfahrungen

CGDataProviderCreateDirect

It’s hard to find an example using CGDataProviderCreateDirect, so here’s a quick snippet:

static unsigned int* data; // used for manipulating pixel data directly

const void * getBytePointerCallback(void *info)
{
	return (void*)data;
}

@implementation SomeView

- (void)createImage
{
    CGDataProviderDirectCallbacks callbacks;
    callbacks.version = 0;
    callbacks.getBytePointer = getBytePointerCallback;
    callbacks.releaseBytePointer = NULL;
    callbacks.getBytesAtPosition = NULL;
    callbacks.releaseInfo = NULL;
    
    float w = self.layer.frame.size.width;
    float h = self.layer.frame.size.height;
    
    w *= [UIScreen mainScreen].scale;
    h *= [UIScreen mainScreen].scale;
    
    int numComponents = 4;
    uint dataLength = w * h * numComponents;
    
    data = malloc(dataLength * sizeof(uint)); // TODO: free
    
    uint r = 255;
    uint g = 0;
    uint b = 0;
    for(int i = 0; i < dataLength; ++i)
    {
        data[i] = 255 << 24 | b << 16 | g << 8 | r;
    }
    
    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
    
    CGDataProviderRef bitmapProvider = CGDataProviderCreateDirect(data,dataLength,&callbacks);

    CGImageRef bitmap = CGImageCreate(w,
                                      h,
                                      8,    // bits per component
                                      8*numComponents,  // total bits
                                      w*numComponents,  // bytes per row
                                      colorSpace,
                                      kCGBitmapByteOrderDefault,
                                      bitmapProvider,
                                      NULL,
                                      false,
                                      kCGRenderingIntentDefault);    
    
    self.layer.contents = (__bridge id)(bitmap);
    
    CGImageRelease(bitmap);
    CGDataProviderRelease(bitmapProvider);
    CGColorSpaceRelease(colorSpace);
}

couchdb reader_acl

I installed CouchDB 1.0.1 with MacPorts 1.9.1 and quickly ran into problems:

  • The ‘attachments’ test hung in Chrome 6.0.472.55. I ran the same test in Firefox 3.6.9 and it worked.
  • The ‘reader_acl’ failed with an exception.
  • I couldn’t create an admin.

The couchdb.log certainly had errors but I couldn’t find a solution online. I tried uninstalling the port and reinstalling with no luck. Eventually I gave up and downloaded CouchDBX. Creating an admin worked but it also had problems running the Test Suite (I had to Force Quit).

Then I tried Homebrew. After installation I ran the Test Suite with 100% success and was able to create an admin! Awesome, now I’ll just add org.apache.couchdb to launchctrl…hmm it’s not under /Library/LaunchDaemons or /opt/local/Library/LaunchDaemons. After a little digging I eventually found it under /usr/local/Cellar/couchdb/1.0.1/Library/LaunchDaemons/. Only a few steps remain:

  • Copy org.apache.couchdb.plist into /Library/LaunchDaemons
  • Change the value under the UserName key to your user short name (hint: look under /Users)
  • sudo launchctl start org.apache.couchdb or you can test it for sure by restarting (shortcut key: Control-Command-Eject)

Everything now appears to be in working order.

adding FLEX_HOME and building as3-signals on a mac

Fire up a terminal:

  • cd ~/Library/SDKs
  • git clone http://github.com/robertpenner/as3-signals.git

You can find the above url on the as3-signals homepage on github. My personal pref is to put 3rd party libraries under ~/Library/SDKs

If you look inside the as3-signals dir, there is a build.xml file which requires a FLEX_HOME variable to be set. So, I downloaded the Flex 4 SDK and dropped it under /Developer/SDKs/flex_sdk_4. In the terminal, we need to set the env variable FLEX_HOME. First, lets check if you have an existing one defined. In the shell, type

  • env

You should see a list of defined variables. If you need to remove an existing FLEX_HOME, you can do so by typing

  • export -n FLEX_HOME

Otherwise, you can add a new FLEX_HOME by typing:

  • FLEX_HOME=”/Developer/SDKs/flex_sdk_4″
  • export FLEX_HOME

If you type env again FLEX_HOME is now added to the list. Now we can build as3-signals.

  • cd ~/Library/SDKs/as3-signals/
  • ant

Ant looks for a build.xml by default. Upon a successful build you’ll find a .swc in the bin folder.

Note: Setting FLEX_HOME this way will only last for 1 terminal session. If you’d like a more permanent solution, see: http://mactip.blogspot.com/2004/04/setting-environment-variables.html

patch 8

As I wade through the tutorials, I stumble upon objects that appear quite handy, like the js object. The js object could have vastly simplified my development of patch 7. How so? Well, like this:

js

Ahh…so much cleaner than the mess I had before. Modifying the Java code to Javascript was trivial, here’s the code for sketch0.js:

outlets = 0;

// global vars
var offset = 20.0;
var radius = 50.0;
var centerX = 50.0;
var centerY = 50.0;
var x = 0.0;
var y = 0.0;
var angle = 0.0;
var frequency = 2.0;
var counter = 0;
var coordsX = new Array(180);
var coordsY = new Array(180);

function bang()
{
    draw();
}

function radians(angle)
{
    return angle * Math.PI / 180;
}

function draw()
{
    outlet(0, "clear");

    // calculate point
    x = centerX + Math.cos(radians(angle)) * radius;
    y = centerY + Math.sin(radians(angle)) * radius;

    // draw black circle
    outlet(0, "paintoval", offset, offset, radius*2+offset, radius*2+offset, 0, 0, 0);

    // draw red circle (10 pixels in diameter)
    outlet(0, "paintoval", x+offset-5, y+offset-5, x+offset+5, y+offset+5, 255, 0, 0);

    // draw green circle
    outlet(0,
              "paintoval",
              centerX+radius+counter+offset-5,
              y+offset-5,
              centerX+radius+counter+offset+5,
              y+offset+5,
              0, 255, 0);

    // draw prev point
    for(var i = 0; i < counter; ++i)
        outlet(0, "setpixel", coordsX[i], coordsY[i], 0, 0, 0);

    // cache prev point
    coordsX[counter] = centerX + radius + counter + offset;
    coordsY[counter] = y + offset;

    // adjust counter and angle
    ++counter;
    angle -= frequency;
    if(angle <= -360)
    {
        angle = 0;
        counter = 0;
    }
}



Another possiblity is to swap the lcd object out in favour of jsui, but let’s not get carried away.

sketch 1

The goal: use the sliders on my MIDI keyboard to control corresponding sliders in Processing. Here’s a screenshot of the resulting demo that maps 3 sliders to variables used in Examples/Basics/Arrays/Array2D.

array2d

Processing doesn’t ship with a collection of standard GUI controls – nor was it meant to. For simple GUI controls, there are external libraries available. I’ll be using controlP5 which you can read about and download here.

To get the new lib working, create a “libraries” folder in your sketches directory. If you don’t know where your sketches directory is located, check the preferences in Processing. Unzip the download and drop the whole thing in the libraries directory. If Processing is already running, you will have to reboot the app before you can import the library. If everything is installed correctly, this example should work.

Messages will be sent to Processing using OpenSoundControl (OSC) – a communication protocol where packets are typically send using UDP sockets. Download the oscP5 lib and install it (don’t forget to restart Processing). Test the OSC lib using this example.

On the Max side, we’ll also need OSC support which will be provided by CNMAT’s collection of objects. I’ve chosen to download the complete package of objects here. Unzipping the file reveals a directory full of files and no instructions on what is to be done with them. I do recognize the .mxo extension as an external – a plugin you can write using the SDK. A search for .mxo in help returns one result:

searchmxo

It turns out that:

  • .mxo or .mxe represent external objects
  • .maxpat and .maxhelp are the new file formats for Max 5
  • .pat, .mxb, and .help are old file formats

Looking under the Max/Cycling ’74 directory, I can see there are folders for: max-externals, msp-externals, and jitter-externals. However, I don’t really want to “pollute” the default installation with 3rd party externals. Fortunately, Max allows us to set additional search paths – allowing us to keep our files wherever we deem appropriate. Place the downloaded CNMAT folder wherever you want (I’ve chosen Max5/CNMAT). In Max, select “File Preferences…” under the Options menu and add the CNMAT path. Below, I’ve set a relative path:

cnmatsearchpath

I’m not sure if it’s required, but a restart would be prudent. However, typing “osc” doesn’t reveal anything during autocompletion. Looking in the CNMAT directory, I discover that the objects are uppercase. Typing “OSC” now reveals:

osc-route

Shaweet. Of course, at this point, I’m still not sure if it actually works, how to use it, or if I should even be using OSC-route in the first place! Fortunately, I saw .help files in the CNMAT directory, so I know that Option clicking the object will bring up a working .help patch. It appears that OSC-route is similar to Max’s route object and not what I’m looking for right now. The CNMAT directory also contains an object named OpenSoundControl, which looks promising, and indeed it is. In Processing, we can test things out by creating a UDP socket to receive messages on port 8080 of localhost:


voidinitOsc()
{
  oscP5 = new OscP5(this, 8080);
  myRemoteLocation = new NetAddress("127.0.0.1", 8080);
  oscP5.plug(this, "foo", "/foo");
}

public void foo(int value)
{
  println("int received!!! = " + value);
}
 



“Plugs” in oscP5 are used to register callbacks when events are received. Values are parsed from the OSC message and passed in as params to the function – very handy. On the Max side, we can create a simple patch to send an OSC message out a UDP socket on the same port:

fooosc

Click the “/foo 42″ message to add it to the OSC buffer, then bang to send all packets in the buffer. In Processing’s trace output, we see “int received!!! 42″.

initosc2

Now that the fundamentals are in place and working, it’s easy to build upon.

On my machine, the controller numbers for sliders are 82, 83, and 28. To find out what controller number your slider is sending, open the ctlin .maxhelp patch and move the slider:

ctlinhelp

Here’s the Max patch with my controller settings that will generate OSC messages:

midisliders

In the above patch, “/xDist 62″, “/yDist 68″, and “/circleDist 42″ are all OSC messages that were sent to Processing. All 3 messages will map to plugs in oscP5, triggering functions that adjust the GUI slider values. Here’s the Processing source:


import controlP5.*;
import oscP5.*;
import netP5.*;

ControlP5 controlP5;
Slider xDistSlider;
Slider yDistSlider;
Slider circleDistSlider;

OscP5 oscP5;
NetAddress myRemoteLocation;

float [][] distances;
float maxDistance;
int yDist = round(32 / 8.0f);
int xDist = round(32 / 8.0f);

void setup()
{
  size(500, 300);

  initDistances();
  createSliders();
  initOsc();
}

void initOsc()
{
  oscP5 = new OscP5(this,8080);

  myRemoteLocation = new NetAddress("127.0.0.1",8080);
  oscP5.plug(this,"onXDist","/xDist");
  oscP5.plug(this, "onYDist", "/yDist");
  oscP5.plug(this, "onCircleDist", "/circleDist");
}

void initDistances()
{
  // diagonal from center
  maxDistance = dist(width/2, height/2, width, height);
  distances = new float[width][height];

  for(int i = 0; i < width; ++i)
  {
    for(int j = 0; j < height; ++j)
    {
       float dist = dist(width/2, height/2, i, j);
       distances[i][j] = dist / 0.5f;
    }
  }
}

void createSliders()
{
  controlP5 = new ControlP5(this);

  xDistSlider = controlP5.addSlider("xDist",
                                    0, // min
                                    127, // max
                                    32, // default value
                                    20, // x
                                    20, // y
                                    100, // width
                                    10); // height

  yDistSlider = controlP5.addSlider("yDist", 0, 127, 32, 20, 40, 100, 10);
  circleDistSlider = controlP5.addSlider("circleDist", 0, 127, 64, 20, 60, 100, 10);
}

void draw()
{
  background(0x000000);

  for(int i = 0; i < width; i += xDist)
  {
    for(int j = 0; j < height; j += yDist)
    {
        stroke(distances[i][j]);
        point(i, j);
    }
  }  

  fill(128);
  rect(10, 10, 160, 70);
}

void onXDist(int value)
{
  xDistSlider.setValue(value);
}

void onYDist(int value)
{
  yDistSlider.setValue(value);
}

void onCircleDist(int value)
{
  circleDistSlider.setValue(value);
}

void circleDist(int value)
{
  float val = value / 127.0f;

  for(int i = 0; i < width; ++i)
  {
    for(int j = 0; j < height; ++j)
    {
       float dist = dist(width/2, height/2, i, j);
       distances[i][j] = dist / val;
    }
  }
}

void xDist(int value)
{
  xDist = round(value / 8.0f) + 1;
}

void yDist(int value)
{
  yDist = round(value / 8.0f) + 1;
}
 



And here’s the Max source:

----------begin_max5_patcher----------
794.3ocyX9zaaBCFF+L4SAxmyx7+HX1sot68P6sopIB305IBDADszU0u6CaC
oosowNMA6npRkof8i+4G+99heZR.XQ0FdCH7ag+LLH3oIAApaIuQPe6.vxzM
YEoMpGCTtd4BdMXp9esJsM6AQ48+plm0p6FRDaVzzvX1L3zvHn7Jt6Z3c8uR
WGTstsf2p5Ob+c+cUYaY5RtZL9dsHsXXHzOb6iq359GHJaASCAKRKuGrsWE4
p2rZwe9RDDrSm1H9m5EQnYQIQHV7KxPTNnBj7dOOYh7xTaAA+uci1vP0x2nl
+fr1BQYXZHlcHFgQRtP0LJdzXj7O6EQH2fHidEMGPvHuYVvWFj.SQ9cWCM9R
XWCibHFAodcWCkcg3Uzbvi6ZnI9zrrpluhWlG90LQcVA+GhlVywXHQ5PMHS3
Bc73ZuLBu+HK3tg2wgWIpA0KFELYrgPSgH2pbLQzgoeWCp40eKWko.W41ezf
QuOrPuQmwbjOGk3ce9vL2i9bn284CYEFIeNB3rkSDl52ZgPzKhZgvGfQrXuV
JDJ5xnTHMF7XkPn4NADK4MMo2yemWQoqOFOT8mYBIpviZVwF+LBniIXHdDRU
twPpRssw0YJG+BB2OVttCJ2TstL+ptwstpnatBglisP09EJw.dHeB7LU+602
b0shk7aS2+lqXOAr04qZj9HDtCAc+fBYPlEDiQ2lz8fDCZjX6.g4du7p9cK9
q5pHuWbUedlwo1JhwRqTuEnqrf2dVsJoJu+qmbMUqqyFFygC7K7E0lyaZEko
shpxceH7qdnGD447xc8qKE4qp5Vr5EQ3c6E0GklPlzDzoZRdDOF0j7nxbslL
s1IOQFWt1gsPSxuM1kbJwFMgbplj0IazOgntWSl3jrtVWpo4VnIhSkD1FKN5
HsSDBT9osjDXetzgFmJ+RFAwhQjQQrVQ13OEXoDUQJIy21vEfM9Sw0ytVwDa
B.51j7XnMFS2l75M4k9.N43nM1TfF1sECYicJxoJJ1BE43DWnye7gS0JMBoB
zAoN+YBN+vqWow6DaU03TK30lsmmvxbWimm7ePYddjC
-----------end_max5_patcher-----------



Until next time!

patch 7

Check out this mess:

mess1

As a little experiment, I thought I would try and implement sketch 0 in Max. I eventually got it working, but I also made a mess of things in the process. A wire cleanup is certainly in order, but Max also allows another type of organizational structure: the subpatcher. With a subpatcher, you can divvy your patch up into reusable blocks, each with its own I/O. Here’s a screenshot of the cleaned up patch using a few subpatchers:

clean1

In programming, it’s never a good idea to hard code anything, but to reduce wire crossings I put in a few constants for circle radius, center, etc. I also noticed in Max Tutorial 11 that there is a cartopol (cartesian to polar) and poltocar object! Doh! Oh well, I’m still learning the basics and it was a good exercise to build things from “scratch”.

This patch took approximately 10x longer to build than sketch 0. Naturally, in comparison, patch building feels clunky and slow – it feels more like an expensive toy than a productive tool. Of course, I’m not blaming Max yet, but rather my beginner status and inexperience with the Max methodology.  I’m not familiar with all the objects in the Max toolbox or best practice in their usage.

Here’s the source:

----------begin_max5_patcher----------
3265.3oc6c08jiZbD+489qfRNOYu2l4af35dHUdOUdLob45JVI18HFApjXOu
Wb4+2CL8fVXEHMyvmRG9JuRCRH59G8WS28L7Ge3tUOl9Z3gUN+Mmew4t69iO
b2cxCUbf6Tiua01fWWGGbP90VkD96oO9eWcO7QYgulIOrfUdnjW1l9RVbXl7
6iUGcWP15uDk77m2GtNCtdbA6Az8NDtewKTxC77AnGPN+p5bfelrusKDNgUQ
I4mZ4m9TZR1gn+m7yvj7eB3vQajzSNM9QQERJJojhHUN+jfsxye0eeeTP7ph
O3O+vGJ9y8iOb3IgCJRLPvAe5fCFxb3fHwAFwaffC+oCNhSC17XPxyFCJDW2
Bz.ikuHPR8myBJxKiAnhainBdLPknmb9KQXmO8IGrS1WBSbpBQwQIgqSeIIq
5MIswMAEfMokFAWJQwNGrYBjQPSGlwMVDBywCqdElbEpXIPRIDp6foXgwSmT
h81antCLrP8tBgE1fKsPGC6vaCObH34vSvETdLYbGjsRKJSKfcFrWeYlkNgg
ysyYy9fe+ekFGr+eDsecbn0lc4xnZvH9kkYLxGTypQr1AmpjZ3dEjnvj7SHJ
N7qg6ODklTgwta0aLjGRJ1igvzDL4HlWENJGqeNNc8uEJIST4A2D9jY+Jo6B
Sd6LjeiZ+o92LJY29vCgIYAYJhu5UN3k3rO2LbV+yeJXcXqmbiP4cqddezlz
jBhn1YVb3xKWgffjg4Uoa42HIXWCmbVZZ7iA6+ZzgnGiCqcuHWRNHIZaPVXV
DPODzwyKZ6t8QPzRGO11vrfMAYA.gT41T04.VQJnl1RsieNsl5ZN+T0i1n1R
6ZLRyHXU3ZmDnxkCV4L5Nm3cFIdGgdhElyYk4tRKMvatu+wwOZMN5gGSXjeq
BiLx3Ai9dyaTrCJ0DzHBityaX7kjcAq+MGTw+ZGQomGQIXHKZH4bac8eebEs
in2W6Eaz1a2lIdzvW40zZ4QE5I.XiW92yCd0wpFxv1o3QUDbc51sgfq472Gm
tuOgCfXaGOP53rfQYmAOpvvLsD.pxv6BxE1R+ZPrS4rOlMxBp.NLSV3o7IQl
0p.A0bAh72Dt++LiPEvhsYnxIFTpNUEKwj+87ASfIw0ePB1XHYevlnWNLR9o
dyKU4+5XvnTH+IXnTGW1akMNmHsKm4NGb9mOK0745sw4nAwthop7sLnXJtGc
3+17OKxseKy+TxtEedyf8gzW1utjiTFWbpy3aBOjEkbLY.+RkIp7tu4Wh1ro
9ruk2Oi1rKM+VzgRyg9EwrhYRX1GcbfyupkbioLDUSFpXJCVwOBWfEvpb1UN
Xf3ml.9l4HBwNNZfH7BYesna1rhrKhQ2gnKbKLmtIdT4j37fr035dbzPxQXc
4HtEbDWwQPl5fZGJGMjbj1pDLK3Hhhi.WDLuiiFHNRWc7F37IUGWW2GMXLXJ
o6FL9eFAHr4zM3WPMY4xhWfYCl7SQlazmgHV6Fm.kppnw.JGMX98LRImZsmb
BChsVME9hQSbnIMw5SpVttgT4Nu7jaDbagRtfKC9CAsXjxWQwnIlgj2Grmev
PFmUpEXzjyOPHvcfgTVggWFPqvXSl6g07iu3slxxusIRoNXNWAks9PvWC274
7Kd9rf+bPV19nGeIClDY0xXqQQauTQgarXvs8keNN8wfXUM0OdAWoUAlaaVy
.JLBsXm18x.sVWHpRPX+0KCX9z0RPcuQOn.pLXM5g6RidrznGKM5wRidrznG
KM5wRidrznGKM5w0PidrziGK83wsUOdbdTYoKOV5xikt7XoKOFjt7XFkXxkz
FujW+qsBubkV.rq05MdCV52au5yey0BEWq8xxUZqCc60CW2n8Y2MUuPds1Tp
WqMA7sV2XOyZW9kt7ne1.OjaeGVrAdn1WSFnMvCxDtAdvstONFr8IIBdDfi1
2hWrQ9PTS9f51uxGX+qpMntx8hMNefDPnrodCuwxVfhy3UZAJ.l5uNfhhmnN
fhR48PGPc1ekkNf5JtCn5kp7i88g42wWpxuEExDPOHxkuuqxu.19Tw9eWVke
WyECNWoauEpwOl1uXxMPE9Acj9CR99oB+.xUlnqkJ72GU3GvTJUbcUg+YUy6
pjKUgZOrccJAc617tjwCFONs+9.FGlMUjks9glK2g.JBkKT1YA43nq1RRQUb
DprHaH0nq1xFh.NBLLhoziiVpeasaD9CbGMLKna57YQ3itR2FfPCbehrzNHV
07cx6KV.2tPu2Ay9yCx8FgO88RnemXG0JyFRhnbzDW.4FTazr9wxfJvtROwJ
ty0a52SS7ss.+BfE.IMJ93nkBhOba6A6b1IWQ+oo62bn4xYQOSg9TKkQ34yU
QHTWrdVvZi49JuwnJC2XAtnCWAtbUF9fk9psE3RmekkBbcEWfKfJrsfD9dPQ
gIkO8sZHmBWQEp5L3j8oUUk0ObaOC.62DufmA4upiU4hB6mHTepdk4BiLtNW
TAxY82VGG5jezc4e6YTgtJYeTeUACWyqfQtA5rYz57FJ8W+gHrYPMc5nRB1G
YjRB0XcjuAAXkqgjGg0LhyYtFw3DiY7WGJFuaZAJ9lXhRPsGQccuxlE+bNOk
t2II2sX+iOkWpl7+9MqkWJ2iMfGIwkUAwpfTXnYPPJmCkd0ZTR0UR8.HQ8l2
QxIehyFt2AmOW+OlGHP6PFSGERLUBYPjvZ2UWk+u0g40deLwmCf7OlOwO6iX
FZAAJ1nRU1vdWgdfoGcdWy2NgkJuFiDTJPyenDgcY7NhmDrr+hDD8T5sFO4y
A77bNbJhKNH4fymbxCMHe5T+nytn+J1CYebsJu0..ioht3t1ed6I5PTRWsQV
5vVLvBhDwb2o9gtpRqPR+gFI4y9chErt06milWKybsqiK+Jktsr+J3BXqj.J
1gu6wQCUED0sCX7nyqFAPWAew7RvmYBYisoov.AHeXAr.4gye3pnNyDwmtvO
9Uh0PNZfXHg1Z3yJ4JOcKc97RMFbfg0ZMvaGg6Qdvil+ehhRH6VtD.4pQCDa
o69yC1xt8QwB9pMeqiCFr6RZyO7YUatYFc2WpEKsMR+rJ4WGGFr23k+b4JBG
Vnu88pjm6Mgaa.adY6NiwCUF5fYKw54MUB9DtoRbxx8UeLA7C.HiPzuKPdN0
z9Gp+fj0owwMCFrK.FLPcg6e48QgpIE2HfgX5CVlJ1OUW6e3eVbUA1zY0O+1
kWSargaeT0CU8dWtErStPz5f.IG1a4gsXr9SfjwlvGnOpkm2gvrcQuFFaGvv
bkYu02umAF5zALlKhPgl1Z.2vSHSmsbK1LbfXeAIig.MPSGZ7SE6SvVrkIch
i9dEQvSnu9xJAWXc8sBAanONhqDT7Y5AMsT6WcjcZDn3iinif8fsalRDLDqn
mtsXsAXhGYJ0mrBTTOY8FPPwcL1ioxRe9YK1FoDdprKTx2FYNopcilel4g6u
6uaCy1m5X9lLm.Rfha08ghyxh0ZRKchvXBmrncydVAIkoJqmm8LkNB.R75M1
4ef6BOjhTK3DxYY63nCRWDkuV5wnQMfKp.HOq5UFDX02mwKECeZZqql+p1R8
KtZtVOMAWMmbqSPecIIlFjTcx9hTjKRsdzfMSGW5wQcjVqmgy11VYMiXEXIw
xfG4CbHksxQcjX8HZPrEOoReagReYpk3IKzBEZTFZtw+hzlyXpC0QRt1pwss
RDQLCeGCTrHYN1fhJSHLUubUaDDqkPJ6JGLJhCdcQbffckhCDu9Sb3RTrKaT
EGb0wbE0LRhndLJ.KJBr33ftBeHcnUznheXWcjBMjlD9RSnP+93d78cjToZP
oXC8LA2bovRRjgNNnqnpPWiTimecpV3mUN14U0T38flB0SGZ0PGODlj9XkOi
UQGG0061ZaIeD0q0IxHr+7yVS8R5pssFHuhTv8mnGhrjqisZCk.UjmZe8mxn
uai82d8Esj.MKThw3l83Fq.Aqa.3iGMQw8uUYNmAFhoUsJ2ccBha+SqEqE2B
xi4UgVYdcmVE5dulNdpD95Nae5rZ19T53plVyNUKwNYn2Tks1xozIXGG0Qhk
qSjJbhoQkJoOFV7lRgbvHDAM2tHnQR8WnwmkC5JtJF.bEHOFr3KUvJo6SKlq
i2W13pDQ0cBHiGIwoCvsztZ9i0+tz5JIoCLwF2HmnHMyxx343hJzcRWiGMQ7
5eoI07T4rpAyw5dvbTsR7iXbEyzA+niLMoENY3MUlpFCkKZXwwQckZYZNQP7
7ZhflFOW4r98pDNmn6QcnK5YQsuf.jToVF2CQHoUluItlcuVQeTn3WTN+ArP
H3B0g5JIqi5835YCqsaDCPQUhjUYE0yWBhtD0g5HEq8jHQypIQx6RIiEH0yF
1piHPOOv8gcma+t6SjqKzZaZzxG7me3+CaXG+hB
-----------end_max5_patcher-----------


patch 6

So, this Saturday’s Lotto 6/49 is an estimated 43 mil! So, in the spirit of things, I decided to make a patch to generate some random lotto numbers:

lotto649

Here’s the OS X app and here’s the patch:

----------begin_max5_patcher----------
893.3oc0YssaaBDD8Y7WwJZeqtorWA2p7P+A5OPUUD1rwgTtXAKsoIJ+6kc.
eI1Xf0jfikkAMKqWNygYNyr3mlXYOO8AYtM5qnehrrdZhkELjd.qZaK6X+GV
D4mCSyNQ92z42aOs5RJ4CJX3vaQeLDit9ZDFotSlfVDI8yVOsnvD4hzhDXtj
5AW4qVbWXxxaxjKTUP.KXW4LEQnX8IgPejVND5W0+ljh3vjHoBvBtdvv..Bk
v5ytt1amYZgZ+oVMj5eqjU2Pa6MK8soIpD+X3B1eOKzOxdmqjG9HbEL4JG8n
OOYh9vzgwZeBgsagMbv6vFTxU7RCmiwFjFXCggrQn9Iz4jPJxRPrYcyIXWt9
DCNZFmvZlSHswISQ1y8SVdd4lGiP4oYpVHmprGFwENQMmanFxMZhYrHkh34x
rNc95jEhW6NeSRGjK3.ikYoEqPhNoG5LPSUXdrAm89M1HVlm6uTd.w7hZPMv
ITGMM3BoKT3H1yDJw4hpXyAknCJhWgjQ4xVJVSON6QXjCJVy7LHiiItn3uUY
kY7HwWZs9TsDLGzeDXiUgX7l4DmyYdTtTgbZwoINzAkHwnWTABPxgLC4T9oM
IWrvqpWEHlvqifAdC7BtYdg0QIo0eO6sysxewu0zT2ks8fN43BiqKQtzhchh
5tJckXJeV6c72f7AwwvHlcCWNElod3b++rdE+vOzqUkehr+11EUOmfaJQYo2
diuRkENuPUs4SqMjnksrrOOvg.Vuh1Mk7KWXUZRO1FAgsNfyPhFOyvvt51DO
AmQktbYjrGNC+T8E2SZahudIEwRUVJxi1sOVUhg6YrLAlcZOuFhTA7qg1o16
Mr.9md7WRU4oEYKVe+Wq+iHa.QfLWEl3qBKCs2NI8q7.skHtKLHPlraKCwgA
qRKejUChi7fquXZua2QvDyLLgcofTmnp2AVUV4Ksb.KO2CLvtUg+XG8Z.VCz
G0M1+p6iCDSZAm2aXZua2QvjXbwjnGXR2zP4tfFKLw5ElbFUdpWZKLw3ioNi
mHlps3BZKXnmpZgFswPSH6Sv+ddT2fsVDCW+VNc2XMTz1GYa89vFSIs9fIL6
8Gl3iapZuhz1q9vatLKsOwS7QES7dUNZbiw2SspkxQiGlH8o8F93l2wnuApo
DL7elgK2H8NpoZqwnAQSKnSgs6S4js0o.ig9zl9V27QowyS9OLQYdeI
-----------end_max5_patcher-----------



And here are some winning numbers ;)

winningnumbers

patch 5

Yay! I made my first patch from scratch – a learning hurdle. The idea was simple and small: adjust the radius of a circle. Here’s a screenshot:

circleradius1

And here’s the patch:

----------begin_max5_patcher----------
722.3ocyXssiaBCD8YxWAhWa1HrwPf9V+KZU0pJB3l3VvFAl1zc09uWaykPS
.BPR8FEIPdLd3bNiGOC40UFV6XGwEVlez7qlFFutxvPYRZvndrgUZ3wnjvB0
iYkhKJB2isVWMGGejqrGkfCyarRKSYk7DLWsFPs0rPdzABc+2xwQ7p2oiu8F
60lPO0Mmsxq.+M1lOWulJ2v+SFtZAVVsS8cFkWPdQMA.JVYkYRrBOrc+3IGm
N.hPavCriCngoJGX8obRXhkbh2VsRdY8DEjhDRLtk4Y4LNSB2VGefkSdQ7lD
degpCxQIKnJoxdZpifuJua2mv.b6UXZfRqpZKV8BjjHVZJlxuXORdXLorneY
vdDYvw6jLf7tPEt9FAXvn789rQXWImynyNHC78kLx2ogWWKFuKjt+TbtKKQ8
yxEvEJ92BOdQ.LKL5ml1U+VJQgPYHxbq2b1MOgPLrWxitqg3gjkbrHgO1LKj
P4resfL8Fso5bPf88Vb.ZX++.hySKUL.9.UQA3F2qoEBYeVxgsFpKLfb7gYK
GPD5+qb.BzgbTltCOPCBvwHuqh7PkF3NgiGkje84mRxEvltOA2sRyDDFuQSa
DlHokoRSdnGAwpIw48QrPuSh0PcaDILhy+xra2.FDzUEQKneCfNNucbd+4Yy
afC7V4sNZyJIJtepgtZhgCnNx52da3TiDRgJ2n4dcpRucdAtZiWpUI7E87u1
RgVo8+kxErx7nFnzjdYdBtw3BNgFxILZmGRVXqyCcfDGiocC6oj3LlfI0fv7
4dC.SFSdS.SxpK5DStS.SxOLTiX5rW2.5z7fjiefrQ.mpVEAAaaGoCADhVDZ
251ArxA5.qpMffYiUfmaUK4U+oDdZBspT3EfVWELg.UShpQ2JZClBZEe0kIT
eI2SFSNZCSmcl6HXx9ADS.8gooT.6rJJOFXBoWLAt+EKtUHAmx1oaAShAus5
unBufPC
-----------end_max5_patcher-----------