I recently purchased a block of 8 Static IP addresses for use with my U-Verse plan. U-Verse has always been a very stable and reliable ISP for me the last two years and their price of $15/month was pretty good so I jumped. This gives me 5 usable IPs that I can use to host various websites.

I want to host websites on a machine on my internal LAN in the 192.168.x.x block, but use port forwarding on my firewall so that port 80 can be sent on through. The reason for this is mostly so that I can access the server machine on the internal LAN, host print servers, etc… while still using it as a secured internet webserver.

Normally, ISPs give you a block of IP addresses, you assign them in your router and send them on where you want to go. Not so with U-Verse. Each static IP is actually dynamically assigned via DHCP from the U-Verse gateway router box. Each IP address pulled dynamically off the gateway MUST have a different mac address. Unfortunately, most off the shelf firewall routers don’t support this capability. They have one, maybe two, mac addresses that they use. Normally, the uplink port has a single mac address that it pulls a dhcp ip address from.

I’m using a D-Link DIR-615 rev. C that I had laying around and noticed that OpenWRT listed it as a supported device. OpenWRT is custom firmware flash for routers that runs a small version of the Linux operating system on it. I figured if I could get Linux running on the device, then I’d be able to accomplish what I wanted…namely, pull all 5 usable IP addresses off the U-Verse gateway, and forward certain traffic on a per-IP/port basis to particular internal LAN machines.

I first downloaded an OpenWRT package (http://downloads.openwrt.org/snapshots/trunk/ar71xx/openwrt-ar71xx-dir-615-c1-squashfs.uni) for my router. I then held in the reset switch for 30 seconds while plugging in the power. This puts the router into recovery mode. I manually set my computer’s ip address to 192.168.0.2 and navigated to http://192.168.0.1 which brings up the recovery flash page of router where I could apply the .uni flash file for OpenWRT.

I reset my computer’s ip to dynamic and restarted the router. After all the lights stopped blinking, made sure I had a valid 192.168.1.x IP address and did

telnet 192.168.1.1

This brought me up to the linux shell of the router. I ran the passwd command to set my root password for the device and then exited the shell. Once the password for root is set, telnet becomes disabled, but SSH is enabled. I then used putty to connect to 192.168.1.1 again.

Next, I installed the packages ip and kmod-macvlan. These packages allow you to create virtual ethX adapters with separate mac addresses.

opkg update
opkg install ip
opkg install kmod-macvlan
opkg install hostapd-mini
opkg install luci-admin-full  
opkg install luci-fastindex
opkg install luci-app-firewall

I modified /etc/rc.local to create the virtual adapters.

#AMW edits
ip link add link eth1 eth2 type macvlan
ifconfig eth2 hw ether 00:24:01:f5:1b:22

ip link add link eth1 eth3 type macvlan
ifconfig eth3 hw ether 00:24:01:f5:1b:33

ip link add link eth1 eth4 type macvlan
ifconfig eth4 hw ether 00:24:01:f5:1b:44

ip link add link eth1 eth5 type macvlan
ifconfig eth5 hw ether 00:24:01:f5:1b:55

ip link add link eth1 eth6 type macvlan
ifconfig eth6 hw ether 00:24:01:f5:1b:66

ifup -a

eth0 is my local LAN interface. eth1 is my main outgoing public internet interface. eth2-6 are virtual macvlan interfaces that will each hold one of the static ip addresses. I also modified the file /etc/config/network so that the new virtual adapters would be included in dhcp setup.

config 'interface' 'loopback'
        option 'ifname' 'lo'
        option 'proto' 'static'
        option 'ipaddr' '127.0.0.1'
        option 'netmask' '255.0.0.0'

config 'interface' 'lan'
        option 'ifname' 'eth0'
        option 'type' 'bridge'
        option 'proto' 'static'
        option 'ipaddr' '192.168.1.1'
        option 'netmask' '255.255.255.0'

config 'interface' 'wan'
        option 'ifname' 'eth1'
        option 'proto' 'dhcp'

#First static IP
config 'interface' 'wan1'
        option 'ifname' 'eth2'
        option 'proto' 'dhcp'
        option 'defaultroute' '0'
        option 'peerdns' '0'
        option 'gateway' '0.0.0.0'

#second static IP
config 'interface' 'wan2'
        option 'ifname' 'eth3'
        option 'proto' 'dhcp'
        option 'defaultroute' '0'
        option 'peerdns' '0'
        option 'gateway' '0.0.0.0'

#third static IP
config 'interface' 'wan3'
        option 'ifname' 'eth4'
        option 'proto' 'dhcp'
        option 'defaultroute' '0'
        option 'peerdns' '0'
        option 'gateway' '0.0.0.0'

#fourth static IP
config 'interface' 'wan4'
        option 'ifname' 'eth5'
        option 'proto' 'dhcp'
        option 'defaultroute' '0'
        option 'peerdns' '0'
        option 'gateway' '0.0.0.0'

#fifth static IP
config 'interface' 'wan5'
        option 'ifname' 'eth6'
        option 'proto' 'dhcp'
        option 'defaultroute' '0'
        option 'peerdns' '0'
        option 'gateway' '0.0.0.0'

I made sure to set the gateway option on all of the virtual adapters to 0.0.0.0 so that the regular default gateway of eth1 would be used instead of the static IP default gateways.

After re-booting the router, I navigated to the U-Verse gateway and configured each of my new mac addresses so they mapped to the static IP addresses instead of internal 10.0.0.x ones.

After rebooting the router one last time, I now had all of my static IPs assigned on the router and could install and utilize the LuCI interface for configuring routing and port forwarding.

Posted by Andrew, filed under Linux, security. Date: January 6, 2010, 11:41 am | No Comments »

GraniteDS is a free and open source (LGPL’d) alternative to Adobe® LiveCycle® (Flex™ 2+) Data Services for Java EE application servers. Java Message Service (JMS) is a technology designed for handling real-time Publish/Subscribe architectures of which Apache ActiveMQ is an implementer.

By default, the GraniteDS messaging architecture (called Gravity) uses its own internal simple Publish/Subscribe infrastructure. This works great if your front-end only needs to worry about handling clients from Adobe Flex, but what about if you need to send messages from other back end processes and have your flex app update in real-time?

The GraniteDS download package ships with a good example called graniteds_chat. It demonstrates a simple chat application between two or more Flex clients using the built-in Publish/Subscribe architecture of GraniteDS’s Gravity component. My goal is to use this example, but replace the default GraniteDS architecture with the more robust ActiveMQ architecture running in a separate process.

The reasons for doing so are several. First, ActiveMQ can handle persistent messaging. If my server crashes for some reason, I won’t lose messages that were currently in the queues/topics. Secondly, I want to demonstrate running ActiveMQ in a separate process. GraniteDS already has an Embedded ActiveMQ example on their wiki where it loads and runs inside the Tomcat container. I want to break it out as a completely separate process. This gives me additional future scalability if I need to run ActiveMQ on a different box entirely, or setup a multi-machine JMS infrastructure.

First, download the latest package of GraniteDS. Extract out the folder structure, and modify any of the env.properties file to point to your installed Flex SDK. My env.properties inside graniteds/examples/graniteds_chat looks like this:

#==============================================================================
# Granite Data Services Examples build properties (http://www.graniteds.org).
#==============================================================================

# Set 'FLEX_HOME' property to your flex3 sdk installation directory and
# 'FLEX_TASKS_JAR' to your flexTasks.jar location.
FLEX_HOME=C:/Program Files (x86)/Adobe/Flex Builder 3 Plug-in/sdks/3.4.0.9271
FLEX_TASKS_JAR=${FLEX_HOME}/ant/lib/flexTasks.jar

# Set 'SERVER_HOME' property to your JBoss installation directory and
# 'SERVER_HOME_DEPLOY' to your JBoss deploy directory.
#SERVER_HOME=/jboss-4.2.3.GA
#SERVER_HOME_DEPLOY=${SERVER_HOME}/server/default/deploy

# Alternatively, set 'SERVER_HOME' property to your Tomcat installation
# directory and 'SERVER_HOME_DEPLOY' to your Tomcat deploy directory.
SERVER_HOME=C:/apache-tomcat-6.0.16
SERVER_HOME_DEPLOY=${SERVER_HOME}/webapps

Next, run ANT inside the graniteds_chat folder. It will pick up everything that needs to be compiled from the parent folders and deploy a war package to your local tomcat installation. Before starting tomcat and watching the default chat example in action, you’ll first have to modify Tomcat a bit so that it can support non-blocking IO. GraniteDS recommends using either the HTTP APR or the NIO connector in Tomcat to enable non-blocking IO. For our purposes, we’ll use the NIO connector for Tomcat. Inside the Tomcat conf folder, edit server.xml and look for a line like the following:

<Connector port="8080"
           protocol="HTTP/1.1"
           connectionTimeout="20000"
           redirectPort="8443" />

Modify this section so that Tomcat can use the NIO Http connector.

<Connector port="8080"
           protocol="org.apache.coyote.http11.Http11NioProtocol"
           connectionTimeout="20000"
           redirectPort="8443" />

After that change is complete, start Tomcat and navigate with two separate browsers to http://localhost:8080/graniteds-chat. Login with separate usernames and make sure that you can chat successfully between the two browsers. You should see something like the following:
Andrew1_chat
Andrew2_chat

Next, let’s go about integrating ActiveMQ. Download and install ActiveMQ in its own folder. Browse to the bin folder and run activemq.bat. This should be all we need to do on the ActiveMQ side of things. Next, we need to configure GraniteDS to talk to ActiveMQ via JMS instead of its internal messaging architecture.

Stop Tomcat and drill into the installed chat application and modify services-config.xml. Mine is located at C:/apache-tomcat-6.0.16/webapps/graniteds-chat/WEB-INF/flex/services-config.xml. Before editing, you’ll notice that it’s using its own internal SimpleServiceAdapter.

<?xml version="1.0" encoding="UTF-8"?>

<!--
 GRANITE DATA SERVICES
 Copyright (C) 2007-2008 ADEQUATE SYSTEMS SARL

 This file is part of Granite Data Services.

 Granite Data Services is free software; you can redistribute it and/or modify
 it under the terms of the GNU Lesser General Public License as published by
 the Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.

 Granite Data Services is distributed in the hope that it will be useful, but
 WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
 for more details.

 You should have received a copy of the GNU Lesser General Public License
 along with this library; if not, see <http://www.gnu.org/licenses/>.
-->

<services-config>

    <services>
        <service id="messaging-service"
           class="flex.messaging.services.MessagingService"
           messageTypes="flex.messaging.messages.AsyncMessage">
            <adapters>
                <adapter-definition id="default" class="org.granite.gravity.adapters.SimpleServiceAdapter" default="true"/>
            </adapters>

            <destination id="gravity">
                <channels>
                    <channel ref="my-gravityamf"/>
                </channels>
            </destination>
        </service>
    </services>

    <channels>
        <channel-definition id="my-gravityamf" class="org.granite.gravity.channels.GravityChannel">
            <endpoint
               uri="http://{server.name}:{server.port}/{context.root}/gravity/amf"
               class="flex.messaging.endpoints.AMFEndpoint"/>
        </channel-definition>
    </channels>

</services-config>

You’re going to want to modify this services-config.xml file so that it uses ActiveMQ and the JMS Adapter.

<?xml version="1.0" encoding="UTF-8"?>

<!--
 GRANITE DATA SERVICES
 Copyright (C) 2007-2008 ADEQUATE SYSTEMS SARL

 This file is part of Granite Data Services.

 Granite Data Services is free software; you can redistribute it and/or modify
 it under the terms of the GNU Lesser General Public License as published by
 the Free Software Foundation; either version 3 of the License, or (at your
 option) any later version.

 Granite Data Services is distributed in the hope that it will be useful, but
 WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
 for more details.

 You should have received a copy of the GNU Lesser General Public License
 along with this library; if not, see <http://www.gnu.org/licenses/>.
-->

<services-config>

    <services>
        <service id="messaging-service"
           class="flex.messaging.services.MessagingService"
           messageTypes="flex.messaging.messages.AsyncMessage">
            <adapters>
                <adapter-definition id="default" class="org.granite.gravity.adapters.JMSServiceAdapter" default="true"/>
            </adapters>

            <destination id="gravity">
                <channels>
                    <channel ref="my-gravityamf"/>
                </channels>
                <properties>
                    <jms>
                        <destination-type>Topic</destination-type>
                        <connection-factory>java:comp/env/jms/flex/TopicConnectionFactory</connection-factory>
                        <destination-jndi-name>java:comp/env/jms/discussion</destination-jndi-name>
                        <destination-name>discussion</destination-name>
                        <acknowledge-mode>AUTO_ACKNOWLEDGE</acknowledge-mode>
                        <transacted-sessions>false</transacted-sessions>
                        <!--
                             JNDI environment. Specify the external JNDI configuration to
                             access a remote JMS provider.
                        -->
                        <initial-context-environment>
                            <property>
                                <name>Context.PROVIDER_URL</name>
                                <value>tcp://localhost:61616</value>
                            </property>
                            <property>
                                <name>Context.INITIAL_CONTEXT_FACTORY</name>
                                <value>org.apache.activemq.jndi.ActiveMQInitialContextFactory</value>
                            </property>
                        </initial-context-environment>
                    </jms>
                </properties>              
            </destination>
        </service>
    </services>

    <channels>
        <channel-definition id="my-gravityamf" class="org.granite.gravity.channels.GravityChannel">
            <endpoint
               uri="http://{server.name}:{server.port}/{context.root}/gravity/amf"
               class="flex.messaging.endpoints.AMFEndpoint"/>
        </channel-definition>
    </channels>

</services-config>

You may have noticed that the GraniteDS JMSServiceAdapter uses JNDI to find and connect to JMS. Since Tomcat has a valid JNDI container, let’s define the necessary info in Tomcat. You can add the JNDI info inside tomcat’s conf/context.xml file.

<?xml version='1.0' encoding='utf-8'?>
<!--
 Licensed to the Apache Software Foundation (ASF) under one or more
 contributor license agreements.  See the NOTICE file distributed with
 this work for additional information regarding copyright ownership.
 The ASF licenses this file to You under the Apache License, Version 2.0
 (the "License"); you may not use this file except in compliance with
 the License.  You may obtain a copy of the License at

     http://www.apache.org/licenses/LICENSE-2.0

 Unless required by applicable law or agreed to in writing, software
 distributed under the License is distributed on an "AS IS" BASIS,
 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 See the License for the specific language governing permissions and
 limitations under the License.
-->
<!-- The contents of this file will be loaded for each web application -->
<Context>

    <!-- Default set of monitored resources -->
    <WatchedResource>WEB-INF/web.xml</WatchedResource>
   
    <!-- Uncomment this to disable session persistence across Tomcat restarts -->
    <!--
   <Manager pathname="" />
   -->

    <!-- Uncomment this to enable Comet connection tacking (provides events
        on session expiration as well as webapp lifecycle) -->
    <!--
   <Valve className="org.apache.catalina.valves.CometConnectionManagerValve" />
   -->
   
    <Resource name="jms/flex/TopicConnectionFactory"
              type="org.apache.activemq.ActiveMQConnectionFactory"
              description="JMS Connection Factory"
              factory="org.apache.activemq.jndi.JNDIReferenceFactory"
              brokerURL="tcp://localhost:61616"
              brokerName="activeMQBroker" />
    <Resource name="jms/discussion"
              type="org.apache.activemq.command.ActiveMQTopic"
              description="Discussion topic for GraniteDS"
              factory="org.apache.activemq.jndi.JNDIReferenceFactory"
              physicalName="discussion" />
   

</Context>

Finally, copy activemq-all-5.3.0.jar from your ActiveMQ install folder to apache-tomcat-6.0.16/webapps/graniteds-chat/WEB-INF/lib. This will ensure that JNDI has access to the ActiveMQ classes it needs to communicate to the ActiveMQ JMS broker. Start tomcat and refresh your two browser windows running the chat application. Send a few messages back and forth to ensure everything is working.

Now, we need to prove to ourselves that messages are indeed going through ActiveMQ and not just through GraniteDS. Open a new browser tab to the ActiveMQ monitor page http://localhost:8161/admin/topics.jsp . Make sure that the topic "discussion" exists and has some enqueued and dequeued messages.
active_mq_topics

If you really want to test out the system, create a simple Java program that can send a JMS message to ActiveMQ. Make sure the resulting message ends up in your Flex app.

import javax.jms.Connection;
import javax.jms.Message;
import javax.jms.MessageProducer;
import javax.jms.Session;
import javax.jms.Topic;

import org.apache.activemq.ActiveMQConnectionFactory;

public class ChatTest
{

    /**
     * @param args
     */

    public static void main(String[] args)
    {
        try
        {
            ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory("tcp://localhost:61616");
            Connection connection = connectionFactory.createTopicConnection();
            Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
            // create our request and response queues
            Topic topic = session.createTopic("discussion");
            // and attach a producer to the topic
            MessageProducer producer = session.createProducer(topic);
            // and start your engines...
            connection.start();
           
            // now send our test JMS message
            Message message = session.createObjectMessage(new String("Hello from JMS"));
            producer.send(message);
           
            //sleep a bit to make sure our message sent ok
            Thread.sleep(10000);
           
            session.close();
            connection.close();
            System.out.println("Sent message ok");
        }
        catch (Throwable e)
        {
            e.printStackTrace();
        }

    }

}

Posted by Andrew, filed under Data, Flex. Date: November 16, 2009, 11:44 am | 4 Comments »

dual_dragmanagers

The new Flex 3.4 SDK has been released. Since Adobe still hasn’t gotten around to fixing this bug, I’ve again taken it upon myself to release my MonkeyPatched code for Flex 3.4 that allows you to use the Flex DragManager along side the Native DragManager in an AIR app. You can grab the code from SVN from my google code site.

http://code.google.com/p/andrewwestberg/source/checkout

Posted by Andrew, filed under AIR, Flex, MonkeyPatch, as3. Date: August 28, 2009, 12:53 pm | No Comments »

oh_example

I’ve been using the ObjectHandles flex library project for quite some time. It’s used in the Nitro-LM Admin tool to give us resizeable horizontal menus.

In the new version of ObjectHandles2, we have the ability to use Sprites as the drag handles to resize and move objects around the screen. I was recently made a committer on the project and have added some functionality to allow Degrafa to be used to draw the handles and rotate them along with the object. Check out Example7 that highlights this new functionality.

ObjectHandles2Example View Source is enabled

Posted by Andrew, filed under Degrafa, Flex, as3. Date: August 25, 2009, 7:17 pm | 5 Comments »

I’ve recently had the opportunity to dig into Flex 4 skinning a bit deeper with the latest beta. While there is a lot to be desired from the separation of concerns in moving display code into the skin and leaving logic code in the component, there is one LARGE gaping deficiency in Adobe’s model.

I’ve noticed a number of people here (Andy McIntosh), and here (Andy Hulstkamp) working with button icon skins. The main reason for this is that Adobe saw fit to remove the icon property from the Spark button. Being a visual element, it does make some sense for Adobe to let users specify a button icon inside a skin as opposed to putting it in the main Button component.

Now to address the LARGE gaping deficiency in Adobe’s model. Adobe developed the skinning architecture WITHOUT taking something into account that we developers use on a regular basis. This is the Object Oriented principal of Inheritance. Note the following excerpt from Adobe’s livedocs:

Try to encapsulate skinning code. Place code that is used by multiple skins in the component class. Place code that is specific to a particular skin implementation in the skin class.

Most skins use absolute layouts within the skin class.

When creating skins, do not subclass existing skin classes. Instead, copy the source of an existing skin class and create another class. Use this method especially if you are going to reuse the skin for multiple instances of a component or multiple components. If you want to change the appearance of a single instance of a component, you can use FXG inline.

When creating a Spark skin, you can use MXML, FXG, embedded images, or any combination of the above. You do not use run-time loaded assets such as images.

The inability to inherit skins is going to kill my productivity as a developer. For example, let’s say I really liked the code Andy McIntosh had done with the IconButton (which I do) and wanted to re-use it. Let’s say I’ve also done some work on button skinning for my application and I want nice looking gel buttons like this:
gel_button

Can I set up my GelButtonSkin to inherit from Andy’s IconButtonSkin to take advantage of his image functionality, but override his background drawing with my own? The simple answer from Adobe is NO. In order to accomplish what I want, I’ve have to create a completely new skin class and use copy/paste from both my GelButtonSkin and Andy’s IconButtonSkin to get my desired functionality.

You might say, “Well, Adobe says in the quote above that code that is used by multiple skins should be placed in the component class”. This begs the question though… Why did Adobe remove icon as a button property in the first place? It’s obviously one of those things where you might want different flavors of it. Perhaps a rectangle button /w icon vs. a rounded button /w icon. Instead, we’ll see a fragmentation of Flex while everybody and their brother develops their own flavor of IconButton along with their own custom skins to do exactly what they want. Productivity for developers moving between projects is going to take a hit due to this lack of code re-use.

Note: This post is intentionally antagonistic. I’d love to be proven wrong on my assertions. If someone has come up with an elegant work-around to the problem of skin re-use and inheritance that doesn’t resort to copy/paste, I’d love to be educated and saved from my ignorance.

Posted by Andrew, filed under Flex. Date: August 3, 2009, 3:56 pm | 25 Comments »

Get Adobe Flash player


View Source

I came across this infosthetics blog post discussing a Javascript interface for doing Chroma password.

I hadn’t yet had a chance to dive into any Flex 4 stuff, so I thought this might be a good little opportunity to play around with it. My algorithm isn’t exactly as described in the blog post, but it seems to work effectively. I’m using a portion of the SHA256 hash to generate the various colors. I’m animating between colors so as long as you type more than 1 character every 1/2 second, a screen grabber can’t grab the intermediary colors and figure out your password through trial/error.

This type of component is useful for ensuring that a person has entered their password correctly or to help them notice right away that their capslock key was on while typing it.

Posted by Andrew, filed under Flex, security. Date: July 31, 2009, 4:05 pm | No Comments »

Back in 2003/2004, I worked on a business venture with my cousin. We would fly an RC helicopter with a camera mount into the sky to take aerial photos. I’ve been playing around in Gimp with some tilt-shift photography effects that make my photos look miniaturized. I’m by no means a professional photo editor, but it was very fun to play with. Enjoy.

toy_tractors

toy_fair

Posted by Andrew, filed under Uncategorized. Date: July 30, 2009, 2:54 pm | No Comments »

smith_chart

I’ve completed all major work on the Axiis/Degrafa Smith Chart. It can display impedance information across multiple frequency sweep groups. You can view the working example and source code by clicking on the image above.

Posted by Andrew, filed under Degrafa, WCAP. Date: July 26, 2009, 11:37 pm | No Comments »

GraniteDS is a free and open-sourced (LGPL) alternative to Adobe® LiveCycle® Data Services. Among other things, it allows you to do Flash Remoting from your Flex code using the AMF binary protocol. GraniteDS is also the first remoting solution to natively support Google’s Appengine for Java.

GraniteDS uses the Gas3 code generator to create AS3 objects that represent your Java data objects on the appengine side. Appengine supports a number of special field types that can be stored in their datastore. Unfortunately, GraniteDS currently only supports the Key type.

I’ve taken it upon myself to create a JAR file you can include in your GraniteDS project that will allow you to use some of these special appengine types on the java side. I’ve also created a new generator factory that will allow Gas3 to convert those fields into types that Actionscript can understand.

You first need to put the granite-gae-converters.jar into your war/WEB-INF/lib folder inside your GraniteDS eclipse project. Make sure to add it to the Java build path in product properties as well.
graniteds1

Next modify the As3TypeFactory class in your project properties. This will allow the As3 code generation to work properly and generate equivalent data types that work from Actionscript code.
graniteds2

Finally, modify your granite-config.xml file so that it adds in the new GAE converter classes.

<converters>
    <converter type="org.granite.messaging.amf.io.convert.impl.GAEKeyConverter"/>
    <converter type="org.granite.messaging.amf.io.convert.impl.GAEBlobConverter"/>
    <converter type="org.granite.messaging.amf.io.convert.impl.GAEShortBlobConverter"/>
    <converter type="org.granite.messaging.amf.io.convert.impl.GAETextConverter"/>
    <converter type="org.granite.messaging.amf.io.convert.impl.GAELinkConverter"/>
</converters>

Source Code and JAR file Binaries

The following additional appengine types are supported with this GraniteDS enhancement:
com.google.appengine.api.datastore.ShortBlob - ByteArray in As3
com.google.appengine.api.datastore.Blob - ByteArray in As3
com.google.appengine.api.datastore.Text - String in As3
com.google.appengine.api.datastore.Link - String in As3

Posted by Andrew, filed under Data, Java. Date: July 16, 2009, 1:35 pm | No Comments »

I was at 360|Flex Indy in the session on the Axiis Data Visualization Framework presented by Tom Gonzales and Michael VanDaniker. Axiis is a framework built on top of degrafa that allows you to develop new and unique data visualizations that can go way beyond the simple column, bar, and pie charts available in the standard Adobe Flex charting libraries.

One of Tom’s first slides showed a Smith Chart. Tom mentioned jokingly that Axiis didn’t yet do something this complicated. For me sitting in the room, I was a bit taken aback. In my WCAP project, I have an open enhancement ticket from a customer asking for a smith chart visualization for transmission lines. They want to be able to click on a transmission line and view the directionality of the data on a smith chart. My original plan for accomplishing this ticket was to simply use an image for the smith chart background and draw my data on top of it. I must admit, I took Tom’s admission that Axiis couldn’t do a Smith chart as a throwing down of the gauntlet of sorts. I talked to him afterward to let him know I wanted to take on the challenge.

To date, I’ve only been working in Degrafa to get the basics of everything down. I’ll need to solicit Tom and Michael’s help in porting the work I’ve done over to Axiis and open-sourcing the code once I get a little further with it. So far, the most difficult part was calculating the arc angles and radii for each line on the smith chart based on the smith chart coordinates where the arc started and stopped. I still have a way to go in adding the various text labels along the curves as well as porting my work into a more reusable Axiis container.

The image above is the from-impedance(red) and to-impedance(blue) data across a 50 ohm transmission line with a sweep from 0.98mHz to 1.02mHz using a data point every 0.001mHz.

Hopefully, this little endeavor will benefit my WCAP customers as well as the open-source Flex community at the same time.

Posted by Andrew, filed under 360 Flex, Degrafa, Flex, WCAP. Date: May 30, 2009, 10:17 pm | 4 Comments »

« Previous Entries