text:
tag:blogger.com,1999:blog-165783082019-02-17T07:46:08.390-05:00Copious Free TimeRamblings about projects I work on during my "copious free time" (CFT).Todd Coramhttps://firstname.lastname@example.com:blogger.com,1999:blog-16578308.post-69131541291216253232017-10-13T09:24:00.003-04:002017-10-13T09:24:41.060-04:00Wish List: Clojure tethered to an MCU running ForthI want to do 2 things:

Use the power of a full desktop system (e.g. Linux, Emacs, Clojure, etc) to play with some SPI/I2C peripherals

Compile a very limited subset of Clojure/Lisp to Forth for flashing into a microcontroller

Essentially, I want to take the "tethered" Forth environment (i.e. a full blown interactive development environment talking directly to an MCU), but instead of Forth (Gforth, etc) on the desktop I want to use Clojure/Lisp (basically a language with very rich desktop support).

#1 is pretty easy. I can pick a popular Forth like Mecrisp (which runs on lots of MCUs) and talk to it's Forth interpreter from the Clojure REPL.

#2 is harder, but necessary if I don't want to use #1 just for prototyping.

But why not just use a terminal and Mecrisp (for #1)?

Each Cortex M arm chip comes with a ton of definitions (registers, bit names, etc) that I don't want loaded onto the chip. Also, every little "helper" function I write (to enrich the Forth REPL) takes space on the MCU

 Tethered Forths don't have this problem (as you leverage the desktop Forth to handle such things).

But, while Gforth is very nice, it still isn't as "rich" as I want regarding integration into Linux/Emacs (i.e. not enough batteries included).

Todd Coramhttps://email@example.com:blogger.com,1999:blog-16578308.post-48353744247605859162017-06-13T17:03:00.005-04:002017-06-13T17:03:59.718-04:00Low Power MCU FetishesSo, I am pretty familiar with the STM32L4xx low power Cortex-M4 MCU.
It has some insanely low power consumption profiles including a 0.65 µA standby mode with RTC (and just 14 µs wakeup time).

This thing is a beast to program (1600+ reference manual to start with and copious app notes). But, I work with this chip for a living.

This current consumption is specified (in the documentation) at 1.8V, so a more typical 3-3.3V actual power supply will likely cause it to consume more current. I am assuming direct battery hookup otherwise the current consumption of an LDO regulator has to be considered.

Still... this is insanely low.

I am looking to play around a bit with some "old" 8-core Parallax Propeller Chips (P8X32A) I have laying around and I read some forum discussion where you could likely get it to consume as little as 7- 10 µA when running just one COG doing not much (maybe as a timer?).

To these jaded ears that sounds like a lot of power, but... honestly... really?

With a couple of 1200 mAh AAA batteries (3V) the P8X32A would run around 11 years. That is greater than the shelf life of AAA batteries.

Most of the current consumption these days aren't from the MCU but from the peripherals and sensors. If I wanted to beacon some temperature measurements via BLE (connection-less -- just as a "tag") maybe every minute, the battery life drops to around 1 year. So, it would be more reasonable to beacon every 10 minutes. Then I could get maybe 5-6 years.

We get lured into thinking too much about how low an MCU can go, when in the world of IoT, it is the RF that is killing us.

Just food for thought.

Todd Coramhttps://email@example.com:blogger.com,1999:blog-16578308.post-72151737429176147872017-06-05T15:25:00.003-04:002017-06-05T15:25:32.409-04:00My Forth Story (Part 1)This is just a few collected thoughts on my 30+ years of using Forth. So, if you are expecting high quality technical content, please move on. Yes, nothing to see here, move on...

This past weekend I was going through old books, trying to clear out some bookshelf space, when I came upon a yellowing Forth Dimensions from 1986. It got me thinking about when I first became enamored with Forth and how it is has popped up now and then throughout my career.

Back in 1982, armed with my first computer: a Commodore VIC-20, I started my first year in college (I was 16 years old -- I skipped a year in grade school) infatuated by the possibilities offered by computer programming. I wasn't really college material (I was planning on going into TV repair or maybe an Art school), but I had just (to everyone's surprise) won the Engineering division of the DC Science Fair and was offered a 4 year scholarship to the University of the District of Columbia. I had prototyped an LED display based oscilloscope using some op-amps and 555 timers. It was inspired by a design I saw in Popular Electronics. But I digress...

So, here I was starting college (and a job as a TA in the computer lab!) and I knew it was time to "up" my skills (I was proficient in BASIC and some 6502 assembly). We had a lab full of the newly purchased Commodore 64s (C64) and a terminal room (oooh, remember green phosphorous terminals?) remotely connected via 1200 baud modems to the school's DEC2060 (more on that later). I would split most of my day time between the C64 and DEC260 and my nights were spent hacking on my venerable Commodore VIC-20.

Suffice it to say, my VIC-20 wasn't cutting it to get me kick started into the highly competitive CS department. I saved up money to get a Commodore 64 so I could continue my hacking education from the comfort of home.

On the DEC2060 we didn't have BASIC. We had a sophisticated Macro assembler, Rutger University Pascal and Fortran IV and 77. None of this would work on the C64, and BASIC was quickly running out of steam.

It was either through BYTE (or maybe it was Compute!) magazine that I stumbled upon this language developed by this guy named Chuck Moore. It was Forth and there were a couple of implementations available on the C64. An implementation that intrigued me, in particular, came in cartridge form and booted (nearly) instantaneously. This wouldn't require me to fiddle with the painfully slow floppy drive.

I became obsessed with Forth. The interactivity and the power (to lock up the C64) was addictive.

But, my CS (well EE, I started as an EE student and defected to CS) courses were on a DEC2060. The DEC20 was a lovely 36-bit word "mainframe" (shhhh! DEC wasn't allowed to call them mainframe as they didn't want to face the wrath of IBM and their patents). The 36-bit word size happened to be perfect for a Lisp cons cell. I found Lisp quite lovely, powerful and intriguing but I was still in the midst of my Forth obsession.

This obsession became even more all consuming, around 1985, when I read about Chuck Moore's amazing Novix NC4016. I even ordered a fact sheet from Novix Inc so I could pour over as much detail as I could -- knowing I would never likely touch one.

In late 1985, my C64 Forth obsession hit a wall. This wall was my obsession with Fractals, particularly the Mandelbrot Set, of which I first heard about in the August 1987 issue of Scientific American. The C64 just didn't seem to have enough processing power to execute my naive implementation of Mandelbrot's algorithm.

Eventually, I found a Forth that ran on a DEC20, converted the algorithm to fixed point and managed to get the set rendered on a graphics terminal (over a 1200 baud modem!). If my memory serves me correctly, the terminal was a fancy Tektronix 4150. It took a lot of false starts and missed classes, but a couple of days later I had a color fragment of the famous fractal.

As I got further along in my CS curriculum, I discovered that technologies like home computers (C64, etc) and languages like Forth were not really encouraged as tools of study. So, I learned TOPS-20 assembly, Pascal, Fortran (IV and 7), TeX and Lisp. I fell in love with Emacs (the original written in TECO!) and generally was happy, but I was missing some of the hands on immediacy of having my own personal computer and personal happy-to-crash-it-language like Forth. There was a driving need, brewing inside me, to do something low level -- something dangerous.

So when a secretly procured copy of AT&T's UNIX Version 7 arrived at the University Computer Center (where I worked, distracting me from my scholarship and short circuiting the pursuit of my degree), I worked with a couple of my friends to boot it on the DEC20, play around with it and then remove it, before the next day's classes began. This was no trivial task as it required hand entering the bootloader on the front panel. Fun stuff.

I soon fell for the spartan language that accompanied the UNIX tape: C.

Over the years, I would continue to play with (and implement my own) Forths, but it wouldn't be until 20 years later that I would get a chance to program in it extensively (around 2006), when I revisited my low level hardware past in the form of embedded development on Microcontrollers.

To be continued...

Todd Coramhttps://firstname.lastname@example.com:blogger.com,1999:blog-16578308.post-50255862916244842572017-04-14T08:29:00.003-04:002017-04-14T08:29:41.567-04:00Hack CWork has been busy and eating up most of my "Copious Free Time", so most of my projects have been placed on hold.

However, one thing I am getting from the past 6 months "deep dive" back into C programming (I've been programming C on and off since 1985 -- yes over 30 years *gasp*), is that a lot of my code in LuaJIT, Perl, C++11, Clojure and Haskell (and others) could be rewritten pretty concisely in C (C99 or C11 in particular).

Now, hold on, you say -- that is crazy talk.

A lot of the types of applications/tools I write are "system level". When not coding Cortex M4 ARMs (my day job) I do a fair bit of networking (ethernet/IP packet level) hacking. Or, I use libraries such as OpenCV to do simple vision stuff. So, I am not really using the advantages of higher level programming languages.

What I am really benefiting from is those language's REPL -- the interactivity.

I recently rewrote an OpenCV based image detection application, I originally explored and coded in LuaJIT, in C99. It was almost a line by line translation (I even found a couple of bugs!).

Okay, so honestly, I wonder if I had some sort of C REPL (gdb on steroids?), all I am missing is a nice convenient hash table (i.e. associative array, dictionary, etc). I don't like the baggage of bringing in whole toolkits/frameworks for that (I like to keep my C lightweight and avoid things like pseudo-OO), so I just need a nice fast, generic hashtable implementation.

I need to get back into hacking C (for a while at least) and avoid the drama associated with picking a programming language "tribe".

Todd Coramhttps://firstname.lastname@example.com:blogger.com,1999:blog-16578308.post-33891759090577447442017-02-01T10:17:00.001-05:002017-02-01T10:17:09.849-05:00Perl 6 - Diving in...So, I've been a long time Perl user since the 1990s. I rarely used it on job, but my only (widely?) used open source contribution is an application written in Perl 5: AFT (It is on github and is also available to any Ubuntu based distro by typing "sudo apt install aft".

Apparently, Perl 6 is now usable.

It looks very interesting. In particular, I am excited about its concurrency/parallel support (why is it that so few languages come with this baked in?). The FFI looks usable (I've managed to get Perl 6 working with libusb pretty quickly).

But why bother?

I've always liked the language design approach of Perl. The maximal syntax approach is dense but can have some appeal. In particular, it seems to avoid the (overbearing) library approach that other languages take. This is a strength shared by Haskell and (yes) C++1x (C++11, C++14, etc).

For me, a couple of lines of well written code always wins over the "I must dive into a hierarchy of libraries and calls". You just need to avoid making the couple of lines too dense.

This is the thing... in C++ and Perl I tend to avoid libraries if I can. Externally dependencies are more subject to code rot. AFT still runs (on almost any Perl distro) in part due to lack of dependencies on libraries that may be "abandoned" or improperly upgraded (to kill backward compatibility with older Perl distros).

But, I digress....

This entry is just my way of committing myself to a Perl 6 learning effort:

I have written 2 Mumble compatible chat/VoIP servers: One in Erlang and one in Lua(JIT). (I attempted one in Clojure but Java based networking made it nearly impossible to do sanely.)

I am now trying to see if Perl 6 is up to the task.

Stay tuned...

Todd Coramhttps://firstname.lastname@example.com:blogger.com,1999:blog-16578308.post-48687604330575017992017-01-18T21:17:00.001-05:002017-01-18T21:17:14.202-05:00Crazy Complexity:The STM32L476The STM32L476 very low power Cortex M4 costs $9 at Digikey.
This tiny MCU has, among other features, 128KB RAM, 1Mbyte Flash and

USB OTG 2.0 full-speed, LPM and BCD

2x SAIs (serial audio interface)

3x I2C FM+(1 Mbit/s), SMBus/PMBus

6x USARTs (ISO 7816, LIN, IrDA, modem)

3x SPIs (4x SPIs with the Quad SPI)

CAN (2.0B Active) and SDMMC interface

The reference manual is 1704 pages long.

The reference manual is 1704 pages long.

The reference manual is 1704 pages long.

I work on this beast at my day job.
Todd Coramhttps://email@example.com:blogger.com,1999:blog-16578308.post-91414045550785156022016-12-16T10:34:00.003-05:002016-12-16T10:34:47.220-05:00Even Simple things are Complicated... in IoTSo, I strive for simplicity in my design. But I realize that simplicity in design doesn't mean simplicity in implementation. Even simple things are complicated when you consider IoT.

Let's take a fairly "simple" example: You want to design a water leak detector for your water heater (or the utility room/closet that hosts it). Or maybe you are in a flood zone.

This water leak detector should notify you (via your Internet connected Smartphone -- you may not be at home) that there is water present (or rising significantly)on the floor. Assume that this is VERY IMPORTANT to you because your house is prone to floods or leaks. Or, you want to make sure your "pump" is doing it's job.

During rainstorms while you sit at work... your mind may wander... to your house... to that damn pump... Okay, IoT to the rescue!

Simple? Sure. Just throw an ESP8266 or ($10-20) Raspberry Pi at it.

Fine... now let us look at what needs to be done.

A water sensor. Okay, let's assume you found one or threw together a nice one that can be securely mounted to the floor or wall just above the floor. Basically let's punt on this one. Done.

You need Wi-Fi. Chances are you aren't located near an Ethernet port and probably don't want wires everywhere.

You need to be battery powered. (Assuming even if you rather plug it into AC, there are flood conditions that could occur during a power loss, right? Like your flood pump isn't working..) So, yes, you need to be battery powered. And the battery should last at least 1 year.

You need a cloud server to host the relaying of messages to your Smartphone.

Okay, so you've done all of that hard work or found a nice little sketch/hackaday-device that does all that for you. Done?

Nope.

Here are some issues you need to consider:

How do you get notified that the battery is dying?

What if someone does an DoS attack (or you changed your Wi-Fi router and forgot to re-configure this device).

Speaking of Wi-Fi... How do yo configure this device in the first place?

Do you have redundant servers in the cloud. (What if your cloud server goes down?)

What do you do if your ISP (or cloud) connection goes away for a few minutes?

What if the water sensor is accidentally "detached" (or is damaged)?

Is your connection to the cloud secure? Is it authenticated? What if some joker thinks it would be funny to fake out your server into thinking that there is a water leak?

What if the device was suddenly "unpowered" (unplugged or batteries were removed). Can you handle that?

How do I know, in general, that the device (and my connection to it) is working properly?

Now, you don't have much control over the "Internet" portion of this (realistically). But, at the end of the day, your device will always be blamed. It didn't notify you and your basement is now flooded.

So, let's address some of these issues. Let's assume that this device is either very, very critical to you (you have lots of water problems and can't afford the massive damage an unattended one would cost) or you want to go to market with this device.

How do you get notified that the battery is dying?

You are going to have to monitor the battery voltage. So, some ADC work.

And you probably should have a local (loud) buzzer in addition to sending it over Wi-Fi

LEDs will be next to useless (unless you tend to hang around your utility room/closet a lot)

Also... Wi-Fi transmission take a lot of power. Consider that in your power budget.

What if someone does an DoS attack (or you changed your Wi-Fi router and forgot to re-configure this device).

Once again, a buzzer. But don't make it too annoying.

How (and/or when) do you shut off this buzzer?

Speaking of Wi-Fi... How do yo configure this device in the first place?

Smartphone? Via Bluetooth? As a (temporary) Wi-Fi access point?

You are also going to need a "rich" app for the phone, or otherwise a nice web server for the device (a web server for a freaking water monitor, ugh)

Do you have redundant servers in the cloud. (What if your cloud server goes down?)

Of course, your ISP can go down... but more likely it will be that $5 per month virtual instance in the cloud that you thought was a really good bargain.

Consider at least 2 servers (not co-located).

What do you do if your ISP (or cloud) connection goes away for a few minutes?

You are going to need to cache this information and send it later... so you need a "retry" mechanism

You are probably going to want an event "date" (or at least elapsed time from). Has it been trying to notify your for hours?

What if the water sensor is accidentally "detached" (or is damaged)?

First you need to detect this. Your monitoring algorithm considers false positives right? Is this a measurement glitch or did the sensor get yanked?

The sensor (which may just be a couple of traces on a board) needs to have some means of being "detected". So.. it needs to be more than a couple of bare wires or traces on a board.

Is your connection to the cloud secure? Is it authenticated? What if some joker thinks it would be funny to fake out your server into thinking that there is a water leak?

Encryption may not be important (this isn't critical private info), but spoofing can and will be a problem. You will need to some form of SSL/TLS, so you just went beyond your 8 bit Arduino in terms of parts count.

What if the device was suddenly "unpowered" (unplugged or batteries were removed). Can you handle that?

Basically... ask this question if you want to use a Linux based solution (A Pi or Beaglebone).

How do I know, in general, that the device (and my connection to it) is working properly?

A system check... a heartbeat... an alert to your smartphone that something is amiss

A heartbeat will affect battery life... be careful.

So... this simple device starts to become complicated really, really fast. Doesn't it?

Todd Coramhttps://email@example.com:blogger.com,1999:blog-16578308.post-67746807402882717212016-12-12T12:02:00.000-05:002016-12-12T12:03:24.684-05:00Brutal High Availability vs SimplicityI've been toying with the idea of using an ESP8266 Wi-Fi SoC (running NodeMCU) as the basis for my kitchen/stove monitor. It's cheap ($3), it has the sensor inputs (and libraries) I need and gets my device on the Internet (IoT!)

However, I have some serious questions regarding the stability of the platform (mostly the software -- and yeah I know I can punt NodeMCU and go with C, but I am still using frameworks and libraries I don't trust yet). Can I run this SoC for years without a glitch? My device can't afford to "fail". It needs to always be working. Even if it had to "reset" due to a watchdog or long running glitch, it needs to be up and running in order to be useful. It needs "High Availability".

What can I do if I want to use this useful SoC?

Well...assuming that the hardware is stable, I can address software instabilities by adding another "trusted/reliable" system.

Maybe an ATmega326 running minimal firmware: Just logic. It would be the "master". But, it is quite an anemic master.

Since my device is AC powered (I wanted something you could enable and use without thinking about battery replacement, etc -- not play the Wi-Fi power budget problem), I don't have to limit myself to an anemic microcontroller. Maybe a Linux SBC? Maybe... a Beaglebone Black?

So, here, I begin to abandon "Simplicity" (and increase my cost significantly). But, I can do a few more things by choosing a Linux SBC:

More robust protocol for Internet use: A real messaging system (XMPP? RabittMQ client?) with caching and reconnect strategies.

More security (Stronger encryption and authentication at endpoint)

Leverage proven multi-year uptime of a Debian or Ubuntu distro

But, why use the ESP8266 at all? Because getting peripherals (e.g. I2C, 1-wire, etc) to work on a Linux SBC is black magic and a waste of my time. Plus, the ESP8266 is cheaper than any Wi-Fi USB module I can get for Linux.

The idea here is to have the Beaglebone control the ESP8266. The Beagle will periodically either ping it for liveliness or simply reset the module before transactions or as a "daily" ritual. It may sound kludgey but so as long as the ESP8266 is okay with periodic resets, this lends the system to higher availability than a pure MCU (bare metal or non-commercial RTOS) solution.

Another benefit is I can do an "all Lua" implementation (Lua on the ESP8266 via NodeMCU) and LuaJIT on the Beaglebone. This would allow me to integrate some telephony (SIP) stuff I've been working on (a completely different project) to "call" instead of just message the user about kitchen/stove activity.

Or, I could just continue developing with my current minimalistic approach of using the ATmega326p with Charley Shattuck's myforth-arduino (which is a pleasure to use -- I've already got my temperature monitor working :)

Todd Coramhttps://email@example.com:blogger.com,1999:blog-16578308.post-91553477189743086802016-12-01T13:38:00.001-05:002016-12-02T11:17:50.309-05:00The Mind of a (low level) Systems ProgrammerI'm a systems programmer... an obsolete term, indeed. But that is what I am. It's not about coding in assembly (fun!) or squeezing out every drop of optimization in C (double fun!), but it is about wanting to "make" systems.

Compare this with an "application programmer" (another archaic term). They love the domain. I love the innards, the thing that runs the application. My work should be silent and never seen. My stuff needs to just "work".

I like watching my front loading washing machine run. It is a complete system, but no fancy UI or IoT interface to be seen. It has sensors, it has actuators, it spins.... that's it.
Most of the time it works (it's getting old so there are a few faults here and there). But it is successful because no one thinks about it. It lies in the background of our lives, silently do its job.

A year ago I had to replace the logic board in my HVAC. It was expensive ($700 list -- but I got mine new from ebay for around $400). The complexity (and wonder) of that board is that it has to be as solid as NASA system.

My HVAC uses natural gas. A lot of the components on that board (and the logic / program) are there to make sure my house doesn't blow up. No fancy interface. No operating system. No complex 32-bit floating point math (I assume... I mean, my house shouldn't blow up do to a rounding error, right?).

I installed the Hunter ceiling fan, in my bedroom, over 15 years ago. It runs every night and mostly through the day. It has never failed. It is still silent. I wonder what kind of motor it has built in and how it is commutated (must be AC since brushless DC wasn't widely available back then -- I think).

That was a good design... a systems design.

Todd Coramhttps://firstname.lastname@example.com:blogger.com,1999:blog-16578308.post-43197114685704701472016-11-27T09:54:00.000-05:002016-11-27T09:54:53.918-05:00Excessive Portability and Embedded DevelopmentWhich is better?

/* Read the angle register (ANGLECOM) */
angle = spi_write(0xFFFF);

or

/* Read the angle register */
angle = spi_write(A_READ | A_PARITY_1 | A_ANGLECOMREG);

Now, you don't have to understand exactly what's going on here (and the actual process of reading an angle from the AS5147 rotary position sensor is a little bit more complicated), but I am trying to make a point.

I would argue that the second code snippet is a waste of time. (Some presumptions here: You had to define A_READ, A_PARITY_1 and A_ANGLECOMREG).

But, why would I advocate the hard coded version?

The chip (AS5147) isn't going to change SPI command structure anytime during its production cycle.

If you choose a new chip, you are going to have to study it and figure out the hard coded values anyway.

The abstraction in the 2nd code snippet is going to only work for this exact chip.

You have to work out the bit twiddling anyway (to come up with A_READBIT, etc)

0xFFFF is what you will see in your debugger

It is *always* 0xFFFF

Ease of modification doesn't work here. If you go "oh, that should be A_PARITY_0" and change it (without verifying the actual resulting write value, it is going to cause a lot of debugging woes).

This is sort of an argument between "ease of writing" vs "ease of debugging" and in embedded development, "ease of debugging" is what you are really shooting for (or maybe call it "ease of validation").

I see the same thing happening with STM32's HAL or StdPeriph. There is a focus on making it easier to load up registers (often taking 1 line of register loading code and stretching it into multiple lines of structure loading using verbose enums/types you have to look up).

To be honest, when I work in Forth on the STM32, I don't have such luxuries and my program is full of well documented hex and binary register banging.

Todd Coramhttps://email@example.com:blogger.com,1999:blog-16578308.post-81993284442607646572016-11-14T14:58:00.003-05:002016-11-14T14:58:53.210-05:00Attack At Dawn

This is a painting on display at The Walters Museum in Baltimore Maryland. (http://art.thewalters.org/detail/4911/the-attack-at-dawn/). It is by "Attack At Dawn" by Alphonse de Neuville.

I am not particularly a fan of military battle scenes, but there is something about this painting that I can't get the image out of my head.
This photo does it no justice. The somber, winter setting, the lighting, the mastery of painting techniques. It is not a famous painting, but it does so many things that resonate with me: The distant foggy morning sky, the snow, the dim light sources (e.g. dawn, the lamp post, the doorway on the left, the rifle fire), the sparse brush strokes, the sense of desolation.
Go see it, if you can.

Todd Coramhttps://firstname.lastname@example.com:blogger.com,1999:blog-16578308.post-73257354044649905792016-11-14T14:20:00.001-05:002016-11-14T14:20:33.038-05:00Literate Programming... A RevisitFor someone reason (nostalgia?) I've been re-visiting Donald Knuth's concept of Literate Programming.

(For a quick intro, critique and discussion on this approach see this blog entry and the responses.)

I first discovered Literate Programming via looking at TeX sources in the 1980s. Then I became somewhat obsessed with the approach around 1992 with the publication of Literate Programming by Knuth. This is still one of my favorite books on programming.

I still like to thumb through TeX: The Program (likely the largest Literate Program ever written).

Perhaps I am starting to revisit Literate Programming because of my full-time-deep-dive into embedded programming (again). Still stuck with C and code that is supposed to work (I deal more with "firmware" than software these days -- code that can't just be frequently updated, is hard to unit test and must be very, very reliable).

Literate Programming doesn't fit well in today's rapid development, big team, fastest-time-to-market culture. But, when I am writing control systems with little instructional software/literature available (e.g. learning how to spin a BLDC motor using sinusoidal waves), I start thinking about approaching it in a literate style.

Shhh... don't tell my partners, but I am definitely thinking about using cweb  or perhaps cwebx for this ;)

Todd Coramhttps://firstname.lastname@example.com:blogger.com,1999:blog-16578308.post-20654176674200040632016-11-08T16:59:00.001-05:002016-11-08T16:59:21.162-05:00SPLAT Logic AnalyzerFound: A Logic Analyzer written in Tachyon Forth on a Parallax Propeller chip.
This is insane. I love it.

https://docs.google.com/document/d/1vszFLwzIfwMEqe2vWA0y4HwVIc4uVpxyjmApKNlY8QQ/pub

Somewhere, in a box, at my last job, is an "over the air" (GSM/SMS) remote control device that I developed using the Propeller chip and Tachyon Forth. It was a prototype I put together in less than 2 months and "field tested". It was an interesting (and fun) experience. I would have love to have used this logic analyzer during development.Todd Coramhttps://firstname.lastname@example.com:blogger.com,1999:blog-16578308.post-10489839899746271722016-10-04T22:21:00.000-04:002016-10-04T22:21:01.642-04:00Spinning a motor is hardI'm trying to spin a 3 phase motor really, really slow. For this I have chosen Sinusoidal Commutation. Just a few sine calculations and I'm good, right?

Ugh.

Sinusoidal commutation of BLDC motors is hard. Even so-called "open loop" commutation (which still expects feedback -- is it still really "open"?) is difficult.

You can find a google load of papers on how to perform (6 step) trapezoidal commutation and then some that kind of talk about sinusoidal.

It's all maddening and the reason why motors are its own field of study. Lots of physics. Lots of math. Lots of stuff you can't shortcut. Jerk, torque ripple, back EMF. Don't get me started on rotors and pole count. How about Phase finding? Know how to do that?

To spin, you must have feedback! Don't Hall effect sensors? How about with angular magnetic encoders? If you are man (or woman) enough, you venture into FOC.

I'm spending weekends and some weeknights learning how to spin a motor so me and my partners can build a killer robotic application. (Killer may be a bad choice of words....)

I'm really learning how much I don't really know.

Spinning a motor is hard...

Todd Coramhttps://email@example.com:blogger.com,1999:blog-16578308.post-52129802201314565802016-05-24T11:27:00.001-04:002016-05-24T11:27:29.728-04:00Taking a SIP from the VoIP fountain....Bad metaphorical post title aside (ouch), I am currently investigating "cutting the Vonage cord" (another bad metaphorical allusion).

I haven't had a proper land line in 10 or so years. Vonage has served me well. But, I find that with everyone in my family owning a smartphone, we rarely use our home phone line. As anyone who has called us will know, sometimes we can't find our "wireless" phone(s) -- is it buried in the couch cushions again? We are also horrible about retrieving voice mail (even though we have Vonage forward transcripts to our smartphones).

Really, outside of having a number "for our house", we don't use it much. But our monthly bill for this convenience is over $30 per month! I know, I know... why don't we just find a lower cost VoIP provider? But that still requires us having to swim in someone else's pool (sorry about that, there I go again).

But, hey... wait a minute! I am a software engineer who specializes in communication. There must be something I can do here. All I need is some way of getting my home phone number to forward to a PBX under my own control. Think of the things I could do!

I could...

Have the call ring to any smartphone that is registered on my Wi-Fi (i.e. mine and my wife's phones when we are home)

Forward the call to voice mail immediately if we aren't home.

Register another "business" phone number that does something similar... basically track me down (e.g. smartphone or home number or voicemail)

..and so much more!

So, I start looking at FreeSWITCH and Asterisk. Wow! I need a book, or two, and a lot of time.

(Another variation of swimming in someone else's pool).

Okay, so do I really need a full blown PBX to do this? Nope. I can do most of this with a cheap DID (Direct Inward Dialing) provider that could forward to a SIP proxy (of my own configuration or design). (I won't go into details about SIP here... just know that it is the standard Internet way of locating and setting up calls. It is pretty complex too, but it is fundamentally a protocol specification.)

So, I start looking at OpenSIPS and over SIP server solutions. It looks like all the pieces are there to do what I need. I just need to write a script....

Okay. My engineer senses start pulsing again (sort of like Spiderman's senses but rather than danger it warns me that I am about to use a complex system to do what seems so simple in my head). I don't want to solve my problem with a simple OpenSIPS configuration... I want to intimately understand what is going on inside of SIP and implement just enough to do what I want. How better to learn a system than to dive right in and try to build one yourself?

By learning OpenSIPS, I'll become an OpenSIPS expert but I won't really know how SIP works. Sure, they take care of the plumbing, but I am interested in the plumbing.

So, I start with the SIP RFC . Well that's over 200 pages! Okay, Todd.. slow down. What do I minimally need to let two VoIP user agents (i.e. phones or smartphone apps) talk to each other?

I start from there.... and here I am today. I've got some primordial code handling SIP registrations over UDP. I have a long way to go, but I am going to have fun with it and I am going to learn a lot.

Maybe I'll finish enough of it to put it out there as open source. Not an OpenSIP competitor, but a super simple, super hacky way of creating your own lightweight home VoIP system.

Note: Currently using LuaJIT and Copas socket server to play around with SIP and I as I mentioned above, I've got Registration working. Ooooh... so much fun!

Todd Coramhttps://email@example.com:blogger.com,1999:blog-16578308.post-70995424948459855172016-04-09T12:37:00.000-04:002016-04-09T12:37:00.080-04:00Hackable (Software) ThingsI like hackable things. I'll keep that vague, because I am in a vague mood.
See if you can spot the common theme:

Emacs

TeX / LaTeX

Forth (interactive on an MCU)

Snabb Switch

Smalltalk (Squeak)

Unix command line (awk, sed, kornshell, bourne shell, maybe bash, etc)

Okay... why?

They are worlds at my fingertips.

They don't use XML.

They are extensible.

I can make them do useful things.

With the exception of #3 (Forth), none really manipulate the "physical world".

Speaking of Forth... having shipped a few professional devices built with Forth, I still haven't found anything nearly as useful or fun for MCU work.

Something I would love to have for embedded MCU work:

A nice REPL / Editor environment (host side, please) for manipulating/deploying eLua on MCUs.

eLua has poor interactivity support, but I wonder if remotely instrumenting it is a better approach... maybe via ZeroBrane or Emacs?

Todd Coramhttps://firstname.lastname@example.com:blogger.com,1999:blog-16578308.post-66785107341413036462016-02-22T10:58:00.000-05:002016-02-22T13:20:04.996-05:00Premature Optimization during DesignAs I design my embedded software, I am always looking for the most efficient tools and design. We have limited resources and must therefore constrain our designs. Or do we?

I remember struggling to get Donald Knuth's TeX typesetting system to compile and run on the big DEC2060 timesharing system back in 1984. It was a beast of an application and not written to run on anemic platforms. It was Knuth's idea to solve the typesetting problem, not write an application that would run on limited hardware.

Now, TeX (same sources pretty much) can run on your Android phone.

Back in 1986 I was trying to get Richard Stallman's Emacs to compile and run under Unix. It was a big, bloated and slow beast (but worth it for all the power it gave me -- I was already an Emacs addict for a couple of years).

Now, I install it on every Linux/BSD laptop I use and fire it up as needed.

These systems (and others) were not designed to work on minimal hardware, but over the years hardware caught up with them.

I am not advocating that IoT devices use big bloated tools, but as far as "basestations" go... why are we constraining ourselves to RasPis and Beaglebones?

Todd Coramhttps://firstname.lastname@example.com:blogger.com,1999:blog-16578308.post-53206524426110900552016-02-16T10:51:00.002-05:002016-02-16T11:02:22.105-05:00Mutter... Adventures in VOIP/messaging systemsOver the past couple of years I've been playing around with a "toy" Mumble server I developed.
Mumble, if you don't know, is a popular gamer VOIP and messaging system. It is open sourced and has clients running on Windows, Linux, iOS (iPhone) and Android (I prefer Plumble). It has a published spec for communication so it is relatively easy to build a minimal server. I've built one in the past in Erlang and have recently started one in Lua(JIT).

Why would I want to implement my own Mumble server (I'm calling it Mutter) when a perfectly good one exists as part of the Mumble project? Well, I am curious how many interesting things I can do with a compliant server without touching the client software.

Some of my experiments involve creating additional levels of authentication (e.g. a query response from a server bot, additional detection of client OS/hardware stuff, etc) as well as the potential to bridge to other VOIP or messaging systems.

Other things I am curious about playing with is "adhoc" conference calls that could spawn quickly and privately in the cloud.

Right now it is mostly for fun. I've got basic messaging and TCP voice channels working. I am not interested in building a full blown Mumble server (that already exists!) but curious as to what can be done minimally....

Todd Coramhttps://firstname.lastname@example.com:blogger.com,1999:blog-16578308.post-55148292421390429102016-02-16T10:22:00.001-05:002016-02-16T10:25:21.447-05:00S.A.F.E: An IoT compatible ManifestoMy home monitoring projects/products follow a manifesto I call SAFE. SAFE is an acronym for Set And Forget Engineered. It follows the basic tenant that home monitoring systems should be reliable and not require lots of care and attention. You set it and then forget it.

This manifesto doesn't exclude IoT (Internet of Things) devices, but it has some rules. Let's consider the class of devices to include: Flood monitors, Stove usage monitors, Motion detectors and Entry/Exit monitors.

If you don't run off of AC, your nominal battery life should be 5 years. Assume 2 years of worst case (power consumption-wise) performance. Do you check/change your smoke alarm batteries religiously every year? Maybe not. If you can't guarantee 2 years of performance (and you are a critical monitor) then you should run off of house current (AC).

If you need to run when power is loss, then you should have backup batteries that last at least a couple of days. This is particularly important for Flood monitors, etc.

If you can't automatically recover from a power failure, use backup batteries to keep the system running or use persistent memory to snapshot states.

Your device should have some "local" alert capability and not rely 100% on the Internet for notification. If I am in the house, there should be an audible alarm and not reliance on my smart phone being notified via the Internet.

If Internet notification is critical, don't trust Wi-Fi. Let's use an analogy: Your car's critical systems (engines, steering, braking, locks, etc) should, by design, run on a separate network than your Entertainment system (radio, etc). Your IoT device probably should follow that same rule. Wi-Fi can get congested, it can have password changes, it is a common target for attack. But what can you use instead of Wi-Fi? Consider ZigBee, XBee or other more robust protocol (no, not Bluetooth!) as the delivery transport to the home router. All home routers still feature Ethernet ports so your transport receiver can be plugged in there. You still rely on the monitor but you are not affected by all the issues with Wi-Fi. Now, of course, you should consider encryption and authentication too when using a non-Wi-Fi protocol...

Don't design for over the air software/firmware updates. This is a HUGE security hole and although you may have thoroughly thought it through -- you haven't. Get your software as correct as possible and consider doing updates through a computer or smartphone "directly" and "physically". Things that can be controlled through the Internet will be a nice fat target for people who want to control your stuff through the Internet. Don't advertise your house as hackable!

No SD cards. Nope. SD cards are not designed for reliability or longevity. Use persistent memory that has at least a 10 year retention.

No rechargeable batteries. How long do you really get on a L-ion/poly? Two years? Five years?

Avoid LCD/button interfaces as much as possible. What is this, the 1990s? If you need a way to silence an alarm or (temporarily) disable a sensor use touch or tap and a simple indicator.

No disabling or critical manipulation through the Internet. Sorry, see #6.

Know thy hardware. Don't just choose a Raspberry Pi or Arduino unless you know exactly how each critical component is rated (e.g. environmentals, write duration, etc).

Know thy software. Don't just load up a Linux and go. Are there processes running you don't understand? Update software maybe?

I try and to design to these tenets. I am surprised how many commercial IoT devices seem to ignore them.

Todd Coramhttps://firstname.lastname@example.com:blogger.com,1999:blog-16578308.post-71117461542603493712015-11-25T13:24:00.002-05:002015-11-25T13:24:32.023-05:00Elderly Monitoring: Revisiting with Brutal SimplicityShort backstory:

I've been running over a year now with the current Elderly Monitor system in my house. Mother-in-law has dementia and the current system lets us know her general movements throughout her living space (e.g. how long has she been up this morning? How many trips to the bathroom?) and whether or not she has opened the front door (e.g. is she going for a walk? Has she made her escape?).
The current system consists of X10 wireless monitors for the door (open/close) and living spaces (motion detection). This is fed to a small Linux computer I've coded with tracking logic, the ability to speak "Front Door is Open", and the ability to communicate (event message and status query) using XMPP to a cloud server (Digital Ocean) and to our smart phones (running Xabber XMPP clients).
It has been a success but with the lessons learned I've found the most critical aspect of this setup is the ability to simply detect that the front door has opened and then notify us via a speaker in our bedroom. All of this flows from X10 to Linux computer to soundcard (the Cloud is not involved here). Still, this seems overly complex. Can it be simplified yet still be expanded to deal with "enhancements" in the future?

Let's review some of the short comings of the current solution:

X10 Wireless - This has been "mostly" reliable and inexpensive. Still, I do have an RF noisy house and what if the neighbor starts using X10 RF? (Not likely, but for a rock solid solution, this is a weakness). Also X10 pretty much means that I have to have a full blown PC (with X10 CM19a transceiver) unless I decide to seriously hack the protocol and build my own RF receiver.

The PC - Why do I need a full blown PC just to do the basic "Door is Open"?

The Cloud - Sure, I've got it, but if I want to distribute the "Door is Open" beyond the bedroom speakers, I have to connect via the Cloud (currently) and subscribe to XMPP messages (essentially what I do with the smartphone). I need to make some of this stuff local.

Batteries. Batteries. Batteries - Damn. Did the X10 sensor batteries die? When did I change them last? Ugh.

There is no indication of whether or not she has just opened the door or left the house. I can code this logic, but since I want to address the above short comings first, this will have to wait.

What is the simplest thing I can possibly do? Especially if I want to add logic like #5?

I am revisiting this problem and addressing it with brutal simplicity.

Two things are going to get ripped out:

The PC. No more computer. A microcontroller should be able to do this.

No more X10. I'm going "wired". No more batteries either. I want to "set and forget" this thing. I'll deal with a little wiring. All of the current sensors are less than 20 feet apart: Door, hallway, bedroom, bathroom.

Stay tuned. More details to follow as I hash out my brutal "simplest thing that could possibly work" design.

Todd Coramhttps://email@example.com:blogger.com,1999:blog-16578308.post-79224707817469799642015-10-19T10:41:00.002-04:002015-10-19T10:41:54.472-04:00Elderly Monitoring: Telling a Story with minimal sensorsHow many sensors do you need to tell a story?

I have a motion sensor in my mother-in-law's room, her bathroom (down the hall from her bedroom) and an open/close sensor on the house front door (which is next to her room). With just these two (cheap) X10-RF sensors I can tell a lot about the nightly activity of my dementia suffering guest.

If you haven't been following this blog's "elder care" stories: My mother-in-law has dementia so she lives with me and my family. She is apt to get confused and wander. Her room (the only available extra room in the house) is unfortunately next to the front door. The rest of the bedrooms are one floor up. Mother-in-law needs constant monitoring. She has "escaped" our house several times (at night and at dawn -- when we are still asleep) with the idea that she is going to walk to "her house". She also complains of insomnia and chronic pain. Is she sleeping at night? Is she up wandering the house?

So, I've designed a cheap sensor-based monitoring system. I explained that tech setup elsewhere. Here I want to posit the question: What kind of "story" can you tell with a couple of sensors?

With just a bedroom, bathroom motion sensor and a sensor to alert us when she opens the front door, I can talk about the following:

Did she leave the house or is she just "checking the weather" (door opens but is followed by movement in her bedroom)?

Is she restless at night (motion in bedroom)?

How many times did she visit the bathroom?

Is she in the bathroom for an unusually long time? (Bathrooms are where a high incident of heart attacks tend to occur)

When did she get up in the morning? (Motion in bedroom, then bathroom, then bedroom again)

Now, my current software doesn't tell a complete story (yet), but with the reports/alerts it generates, my wife and I can determine with a quick view of the data on our smartphone, any of the above scenarios.

I'd like to add a couple more sensors, maybe a light sensor and temperature monitor for the bedroom to help flesh these stories out.

The moral (of this post) is: You can tell a lot with just a few sensors and a lot of common sense. It isn't about the "hardware tech". It is, ultimately, about making sense of data. I want to get my software to the point where it "tells the story" rather than just provide data for my wife and I to review. Here is my ideal morning report (sent to my phone instead of the raw data events):

Betty slept between 9:30pm and 6:15am, awaking at 11:15pm and 2:30am to go to the bathroom. At 6:30am she opened the front door, closed it and went back into her room. Her room light has been on since 6:45am and there is currently no movement in her room.
I don't need this report in verbose english (like above), but I should be able to quickly derive the above story from summarized data points. All of this can be surmised by the current three sensors.

Todd Coramhttps://email@example.com:blogger.com,1999:blog-16578308.post-58275404785537672692015-10-11T10:17:00.000-04:002015-10-11T10:17:12.208-04:00Hacking Inside Out vs Outside In: Lua vs ClojureI've got a couple of CFT (Copious Free Time) projects going on at the same time:

My re-architecting/re-writing of my Eldercare home monitoring system (currently in C++11)

My  Adhoc private VOIP/chat for conferencing project.

I've so far have 2 semi-working (new) implementations for each of these projects. I started developing both in a high level programming language (Clojure) and ended up runnng into a few walls that caused me to look at alternative implementation languages (in both cases Lua(JIT)).

With Clojure I got to swing around futures, core.async and rich data structure manipulation, but I hit implementation walls involving libraries (mostly Java) that don't quite do what I want. Soon I was finding myself installing broken, old or incompatible packages.

Abandoning Clojure, I headed back to LuaJIT. Here I had much more control over my environment, but greatly missed builtin things like futures, core.async and rich data structure manipulation.

Clojure and LuaJIT represents the opposite ends of the spectrum but they do have the ability to overlap (I can drop down to Java/JNI in Clojure and I can evolve Lisp-like richness out of Lua).

It's bottom up vs top down, or inside out vs outside in.

I need to bite the bullet, pick a direction and stick to it.

Todd Coramhttps://email@example.com:blogger.com,1999:blog-16578308.post-90073906277434534672015-10-01T07:17:00.003-04:002015-10-01T07:17:57.568-04:00Confab - Adhoc private VOIP/chat for conferencingIn my copious free time I am working on a new system I am (tentatively) calling Confab.
Confab is an adhoc (on demand) VOIP conference call system utilizing the popular gamer VOIP/chat system Mumble.

Confab will use any Mumble client (iOS, Android, Windows, Linux, etc) but will only implement enough of a subset of a Mumble server to allow for quick conference calls. (Mumble certs won't be used for authentication, so you won't have to install certs on your Mumble client.)

The idea is that there is no conference call service running until you need one. And, once you are done, it goes away.

But, why not use free stuff like Skype or Google Hangouts?

Skype and Google Hangouts require registered accounts (with personal info about you)

Skype and Google Hangouts persist your previous chats (which can be annoying if you never want to talk to these people again)

Your account is "permanent". Your connections, your password, etc. Always there waiting to be cracked or exploited.

With Confab, you point your browser to the Confab Website, enter a conference start time and you are provided with a server name, a port number and a small once use password (e.g. a23gHYz). The Confab Mumble server (tied to the designated port) doesn't accept connections until the startup time.
Because each session is tied to a unique port number, there is more security than can be offered by a single server with "channels" or "rooms".

You give your participants the server name, the port number and password so they can join. Once people join you can chat(text) or talk(voip). The Confab session terminates after 10 minutes of idleness (no one is talking or chatting). You can also configure an absolute call duration time (e.g. 60, 90 minutes, etc). Each Confab session should support a couple of dozen participants.

Why not just use a normal Mumble server? I want to drop the gaming oriented features, but I plan to add unique server-side features such as:

Federated servers - connect multiple servers to allow inter-conference calls.

Support for bridging to other "open" chat/voip servers.

Support "audio casts" (recording and simultaneous broadcasting of audio via one user's phone/computer) to dozens of participants

Moderated conferences (e.g. question and answer sessions, etc) via helper bots.

Voicemail (and text message) capabilities (call in and leave a message for others)

Possible support of POTS (plain old telephone service) bridges

I'm finishing up the basic Mumble-compatible server right now (not yet supporting the above features). It is designed to be lightweight and fairly scale-able. I have no intention on providing or modifying existing client side software.

My server software will be released as open source. I am planning on setting up a small test server on Amazon AWS or Digital Ocean. I'll let you know (here) when it is stood up. If this works out, maybe I can get some donations (Amazon, PayPal, etc) to offset the costs...

Todd Coramhttps://email@example.com:blogger.com,1999:blog-16578308.post-17695215481202999472015-07-19T15:01:00.000-04:002015-07-19T15:01:13.744-04:00Elder Home Care in an RF noisy houseThe BT tags I mentioned in my previous post is acting erratically. During certain times the tracker tokens lose contact with the server (for minutes) even if just a couple of feet away. BT LE is supposed to be broadcasting on a channel not used by IEEE 802.11 Wi-Fi, so I am not sure what is drowning the broadcast. I don't have a 2.4Ghz wireless (house) phone so that isn't the culprit.

I don't have a spectrum analyzer, so I am limited in my investigative resources...

I'd hate to have to drop down to 433Mhz sensors.

The good news is that this can possibly be solved in software. The problem is the "false positives". Since the monitor notifies me upon the sensor going out of range, when these RF anomalies occur I am falsely alerted. One approach is to have a "control" tag permanently installed in the room with the detector. If both the control and tracking tag go "out of range" then it must be an RF anomaly and I shouldn't be notified.

Todd Coramhttps://firstname.lastname@example.com:blogger.com,1999:blog-16578308.post-9130523753593355552015-07-03T19:34:00.002-04:002015-07-03T19:35:52.259-04:00Phase II of Elder Home Care (formerly Elder Home Alone) Monitoring SystemIt's been a while since I've posted about my home monitoring system.

Short recap:

A couple of years ago, my Mother-in-law lived alone in a Condo and was prone to leave her stove on accidentally and other forgetful things. I started working on a home care monitor for the "Independent Elderly". It would include basic occupancy trackers, water overflow detectors and stove/kitchen monitoring (to make sure it isn't left unattended and to monitor her eating habits).

Well, fast forward to.. my dementia diagnosed Mother-in-law moved in just over a year ago. So, the problems are a bit different. She wanders. She gets up in the middle of the night to go to the bathroom and can't find her way back to her bedroom. She may go upstairs in the dark and stumble or venture outside. Sometimes, during the day she may decide to walk home... to her childhood home, several states away. She is old, but fast.

The current system uses "cheap" X10 RF motion detectors and door monitors. I can review past activities (e.g. when did she get up this morning? Did she frequent the bathroom last night?) or I can be alerted to the house door being opened (Is she just checking the weather? Is she going to sit on the porch? Is she going to make a run for it?).
The alerting system consists of some software I wrote (runs under Linux on a small Intel NUC PC) and it, currently, sends XMPP (Jabber/Chat) messages to a cloud server (on Digital Ocean) which runs Prosody XMPP server. My wife and I are connected to this server using XMPP chat software (Xabber) on our Android phones. We can query the monitoring system from our phone or be chimed when the door opens.

It has run well for a year now. :)

But, now that my Mother-in-law is prone to taking long unannounced walks, this system is not enough.
The phone chimes when the door is opened. Is it one of the kids? Is it her checking the weather? Is the door already opened from a previous check? Is she *really* still sitting on the porch 10 minutes from now?

So, after an early phone call one morning, from the Police (she managed to get several blocks from the house before sunrise), we decided we needed to invest in a tracking solution.

Most tracking solutions either involve GPS (battery drain, and overkill -- if we know that she has left we can pretty much find her in a matter of minutes -- if we know she has left.

Not a lot of solutions out there. Found one on an Alzheimers website. It *only* requires recharging every 48 hours. Ugh. What do we do while it charges? Do we need to buy two?

So, I decided to look into BT LE (Bluetooth LE). I had built several BT LE tags years ago and was interested to see what the state of the art was today. Apparently, Fitbit uses BT LE beaconing. That is, every second or so it broadcasts it's address so your phone can handily connect to it on demand.
BTE has a very limited range, but that's okay.
Also, Apple has been pushing "iBeacon" for their own (non-elderly) tracking purposes. They have a spec and a number of hardware vendors. I found this tag on Amazon for $14. Although meant to be used with Apple devices, it does a simple BTE beacon/broadcast that I can readily track. This is perfect size to be "hidden" in her purse (in a small crevice/pocket) and the battery should last 6 months - 1 year (I'll assume 3 months and schedule an early battery replacement).

Armed with the BT 4.0 PCI card in my NUC, I attacked this challenge a week ago. Now I have a rudimentary system that will let me know when my Mother-in-law has ventured beyond the front porch. My android phone (running Xabber) is notified whenever the tag goes out of range.

There is a lot of work to perfect this, but I am happy with the preliminary results. I will be moving the notifier beyond the phone (maybe home media -- DNLA/TV/etc or just speakers on the NUC) and making it work locally in case we lose Internet connectivity.

I will be releasing the software into open source within the next few weeks.

Todd Coramhttps://email@example.com


text:
We've had an unusual number of rather high-profile unfortunate indicents recently. We get lots of questions about the incident and the outcome for the patient from witnesses, concerned passers-by, friends and family, etc. It's nice to live and work in a community of regular customers that have such concern for each others' well-being. But I thought it would be good here to explain, generally, the context within which we gather and disperse information.
The United States has patient privacy laws that prevent us from giving out information except as is necessary for patient care. (The actual laws are quite complex. For more complete information read HIPAA and PSQIA, the Health Insurance Portability and Accountability Act of 1996, and the Patient Safety and Qualilty Improvement Act of 2005. See ya' in a couple months.)
Generally, we try to give friendly but fairly vague answers that sound like we're telling you something when really we're not. We don't do this because we're jerks, we do this because it's what the ethics of our profession require.
I've had this catch patients' friends and family members by surprise. "Why can't you tell me about my sister-in-law or my life-long buddy"? But if you've followed the Gay Marriage debate at all lately you'll know this is a real concern for more than a few people. Unless you're married to, the parent of, or the child of a patient, you might not have access to visit them or find out about their condition while under medical care.
And EVEN IF you're married to, the child of, or the parent of a patient, you might not get information about them released to you. It depends on what's necessary and what they want kept confidential. (Teenage birth control stuff comes to mind as an example.)
For our part, we generally will supply information to patients at the address or phone number they provide to us at the time of their injury. Want confirmation that your daughter's injured foot really prevents her from driving to your house for Easter? You'll have to ask her! Want details of your ex-wife's dislocated shoulder that prevents her from working sent to your divorce attorney? Sorry, we can't help you.
You may see us out taking pictures or measurements at particular accident sites. We gather additional information about certain types of accidents. Generally, this information is provided through channels that require professional accountability such as to employers, insurance claim adjustors, attorneys, etc., but not to your general yah-hoo passer-by hoping to catch a glimpse of gore and mayhem, and not to your buddy who knows a guy who knows a guy.
Protecting our customers' privacy is important to us. Still, like your mother always said, when you're out in public you should always wear your good underwear just in case!

subset: commoncrawl


text:
We reject waveforms 1) with S/N (ratio between Rayleigh wave's amplitude and noise variance after it) lower than seven; 2) with group velocities measured on the positive and negative correlation time differing by more than 5 percents, and 3) with paths shorter than two wavelengths at the selected period for the group velocity map. This results in about 3,500 paths over the initial 11,000 inter-station paths at 16 s. We then apply a tomographic inversion following (Barmin et al, 2001) to this data set to obtain group velocity maps on 100100 = 10,000 cells of 2525 km across Europe (Fig. 2.34). Several geological features can be seen on those maps. At 16s, low velocity anomalies are associated with sedimentary basins, such as the Po basin (Northern Italy), the North Sea basin and the Pannonian basin (Slovakia and Hungary). Both Rayleigh and Love waves exhibit smaller values below the molassic sediments (Southern Germany and Austria) than in the surrounding area.
M. P Barmin, M. H. Ritzwoller, and A. L. Levshin, A fast and reliable method for surface wave tomography, Pure and Applied Geophysics, 158:1351-1375, 2001.
A.L Levshin, T. B. Yanocskaya, A. V. Lander, B. G. Bukchin, M. P. Barmin, L. I.
Ratnikova, and E. N. Its,
Seismic surface waves in a laterally inhomogeneous Earth,
Kluwer Academic Publishers, 1989.
M. Ritzwoller and A. L. Levshin, Eurasian surface wave tomography: group velocities, Journal of Geophysical Research, 103(4839-4878):4839, 1998.
N. M. Shapiro, M. Campillo, L. Stehly, and M. H. Ritzwoller, High-resolution surface wave tomography from ambient seismic noise, Science, 307:1615-1618, march 2005.
F. Waldhauser, E. Kissling, J. Ansorge, and St. Mueller, Three-dimensional interface modelling with two-dimensional seismic data: the Alpine crust mantle boundary, Geophysical Journal International, 135:264-278, 1998.
Berkeley Seismological Laboratory
215 McCone Hall, UC Berkeley, Berkeley, CA 94720-4760
Questions or comments? Send e-mail: firstname.lastname@example.com
© 2007, The Regents of the University of California


text:
While I was on hiatus, I began the process of pushing myself...unlike some people (dogs) in these photos who will remain nameless! ;-)
I decided that instead of taking pictures that I thought might be marketable, I would focus on images that made me happy inside.
I realized that while I was in France last December, I rarely took pictures of people, yet it was often the people that I found to be the most interesting. What held me back from taking images of people, besides the obvious concerns about privacy, etc., was the fact that I didn't think pictures with people in them would sell!
I had become so fixated on what would sell, that I lost site of what "I" really wanted to capture. It's a tough thing to push past what will make you successful, and instead embrace personal success. How many times have we heard people say, "I want to be successful at 'x, y, z,' but they never embrace that success isn't measured from the outside, but from the inside, and it's a life long process.
Now, in case you are thinking that I'm one tie-dyed shirt away from selling magic crystals on the internet, hear me out.
I think that so many of us measure ourselves against the end result of something or someone. We want to jump out of the gate painting like Michelangelo, singing like Sarah Brightman, and designing like Coco Chanel. The truth is that all of those people developed their skills over time, and sure they had the talent from the get go, but it was their talent AND perseverance that ultimately led them to success. I'm guessing the first step they had to take was to believe in themselves, and then to embrace the patience it takes to actually succeed.
So instead of focusing on the end result, the finish line, the "you've made it" award that so many of us yearn to have right after we begin something, whether it be a blog or a photography career, I am learning to enjoy the process.
Some days it's a b*$@&...trust me, patience is not my strong suit. And some days when things work out I'm on top of the world, while other days I ask why I continue to even take pictures...but I know why, because I'm learning, growing, but most of all I'm edging ever closer to who I want to be.
And to help me grasp the concept of patience and mind over matter on days when I'm feeling a little sorry for myself, I watch a few good videos...like the one below. Perspective is a wonderful thing my friends. Now go grab that brass ring you're after...just don't be discouraged when the first 1000 are made of iron. :)


text:
|Julie Krone: Strength and balance.
Julie Krone became the first woman jockey ever to win a Triple Crown race in 1993, and she was the first in Racing's Hall of Fame. This year Rosie Napravnik has a good chance on a colt named Mark Valeski, now on track for the Belmont Stakes. Both women have ranked with the best of their contemporaries, and both happen to be highly attractive.
|Julie Krone's neck
|Audrey Hepburn
I recall the outcry, back in 1990, when Julie Krone's bare back was featured on the newspaper, Racing Action, along with a headline story announcing her return to riding after a layoff due to injuries. Not a good example for the children, letters said. Relax, others said--you'll see more skin any day at the beach.
|Robyn Smith Astaire
Actually, there's no good reason why a woman jockey can't also have a career as a model. Robyn Smith Astaire, actor Fred Astaire's widow, held down both careers successfully for many years.
Julie Krone's neck, in the picture, seems as photogenic as Audrey Hepburn's famously elegant neck, to which the title of Alan Brown's novel at right refers. The novel generally concerns the Japanese fascination with American film stars.
Of course, I like Audrey Hepburn's neck too, but if we had to pick just one necking scene, it would be the train scene with Eva Marie Saint and Cary Grant in North By Northwest.
The tension of this scene is increased by the punctuation of dialog in the form of witty innuendo, between kisses:
Tell me, why are you so good to me? Kendall: Shall I climb up and tell you why? I've been thinking...it's not safe for you to roam Chicago looking for this George Kaplan you've been telling me about. You'll be picked up by the police the moment you show your face. It's such a nice face, too. Don't you think it'd be a better idea if you stayed in my hotel room while I located him for you and brought him to you? Thornhill: I can't let you get involved. It's too dangerous. Kendall: I'm a big girl. Thornhill: Yeah, and in all the right places, too. Kendall: You know, this is ridiculous. You know that, don't you? Thornhill: Yes. Kendall: I mean, we've hardly met. Thornhill: That's right. Kendall: How do I know you aren't a murderer? Thornhill: You don't. Kendall: Maybe you're planning to murder me, right here, tonight. Thornhill: Shall l? Kendall: Please do. Thornhill: Beats flying, doesn't it? Kendall: We should stop. Thornhill: Immediately. Kendall: I ought to know more about you. Thornhill: What more could you know? Kendall: You're an advertising man, that's all I know. Thornhill: That's right. What else do you know? Kendall: You've got taste in clothes, taste in food.... Thornhill: And taste in women. I like your flavor. Kendall: You're very clever with words. Kendall: You can probably make them do anything for you. Sell people things they don't need, make women who don't know you fall in love with you. Thornhill: I'm beginning to think I'm underpaid.


text: Spruce up your wardrobe by adding some color to your closet. QFD will help your attire SHINE with my Limited time only buy one and get one free sale. Buy one Whisper dress and get a FREE Influence dress. Order your Whisper and put the height, size, and color of your FREE Influence dress in the "notes" section during checkout ( Both looks come in: blazin black, radiant red, cool cobalt, miraculous mango, mellow yellow, funky fuchsia, or tempting turquoise).


text:
Well, conventional wisdom (and those experts) must not work under a deadline.
And, to be honest, laying aside a first draft for weeks has never been my method, even before I had an agent and a contract and deadlines. By the time I type THE END on a first draft, I know all the things that are wrong with it, which may include:
- Important information I never found a place to insert
- Important information I inserted in several places, not sure which place would be best
- Plot holes
- Unnecessary side plots, characters, or clues I never ended up needing
- Inconsistent details in setting or world building
- Wavering character motivation
- Pacing
- Necessary character changes (In the first draft of The Caged Graves, the character of Beulah Poole started out as a teenage girl. I realized about two thirds of the way through the first draft that I needed her to be an old woman!)
|Side by Side Outline for Draft 1-2 of The Eighth Day
|Color coded outline after Draft 1 of The Caged Graves


text:
8 Hollywood couples who made movie magic together
They had a lot of friends in high places.
Don't lose your marbles over these facts!
Not even one of the world's biggest stars could win the chance to hang with Khaleesi
Remade movies done right.
What will it take before people admit they knew?
But don't worry—she's gotten good at handling dog poop.
The actor joined the singer for "Close to You"
"Don't forget your sunscreen."
Nothing like a t-shirt to show love
"There is no future."
There are definitely a few similarities.
Character actor Brad Pitt is the best Brad Pitt.
Complete with totally realistic explosion.
Robert Zemeckis delivers another intelligent film for adults following "Flight" and "The Walk."
Several minutes of breaking the first rule.
"No further action will be taken."
The actor will unfortunately be remembered for the Brandon Lee tragedy.
Not your typical locker room talk.
"The things you own end up owning you."
She came to her window, and looked in.
You don't know them because of the first rule.
From the art of fake blood to some continuity challenges.
Aniston's husband Justin Theroux recently commented on the divorce and on Aniston's involvement.
Nearly seven tamer endings were (thankfully) dropped.
Angelina Jolie separated from Brad Pitt the day following the alleged airplane incident.


text:
88 houses for sugar workers in Springfield
SPRINGFIELD, Clarendon — Prime Minister Portia Simpson Miller on Wednesday broke ground in Springfield, Clarendon, for the construction of 88 houses to accommodate 209 persons currently living in barracks.
The construction will be part of the Barracks Relocation Project being funded by the European Union to the tune of $161 million.
"Today represents yet another step towards the positive transformation of Jamaica and the transformation of the lives of an important group of Jamaican workers. The building of modern housing, infrastructure and amenities for sugar workers is one of the most satisfying and heartwarming programmes I have presided over in my entire political career," said the prime minister.
She told the ceremony that both rural and urban housing development must be approached in accordance with the principles of planned development, which means that communities built should also have access to recreational and social facilities.
"This is why another $50 million is being invested in critical social projects, including improvement of school and clinic facilities. We are currently spending some $20 million to improve the Toll Gate Sport Complex and also preparing to put to tender the comprehensive improvement of the Waterwell Sports Complex in Race Course," she said.
Simpson Miller acknowledged that cane production is a seasonal activity, and as such during the out-of-crop-season, life is particularly difficult for many families dependent of sugar cane. In response, she said, the Government has been working towards an economic transformation of Southern Clarendon through strategic investments in agriculture. This includes an investment of $65 million to rehabilitate the irrigation system in the Vernamfield area, and the development of two agro-parks; one in Spring Plains at a cost of $145 million and the other in Ebony Park at $114 million. "The agro-parks development initiated by the Ministry of Agriculture and Fisheries is a key element of my Government's growth-inducement strategy in the medium term," said the prime minister.
Under the Barracks Relocation Project, a total of 385 houses will be provided for sugar workers across the island, including Masemure and Bahram in Westmoreland, Spicy Hill in Trelawny, and Stokes Hall and Hampton Court in St Thomas.
Now you can read the Jamaica Observer ePaper anytime, anywhere. The Jamaica Observer ePaper is available to you at home or at work, and is the same edition as the printed copy available at http://bit.ly/epaperlive
1. We welcome reader comments on the top stories of the day. Some comments may be republished on the website or in the newspaper � email addresses will not be published.
2. Please understand that comments are moderated and it is not always possible to publish all that have been submitted. We will, however, try to publish comments that are representative of all received.
3. We ask that comments are civil and free of libellous or hateful material. Also please stick to the topic under discussion.
4. Please do not write in block capitals since this makes your comment hard to read.
5. Please don't use the comments to advertise. However, our advertising department can be more than accommodating if emailed: email@example.com.
6. If readers wish to report offensive comments, suggest a correction or share a story then please email: email@example.com.
7. Lastly, read our Terms and Conditions and Privacy Policy


text:
First at all I ate pizza and pasta with my friend, called her 'F'. Then I ate banana split which called 'Ren split' with SBSquad family.
We talked a lot about EXO. New boy band from South Korea. I wasn't of their fans a lot. I just like them.
talking about new boyband, I have one of prettiest boy from south korea.
His name is REN from Nu'est #screaming
He is really beautiful and pretty.


text: This high performance USB digital joypad has everything you need to play the game. It features eight-way digital D-buttons, eight digital fire buttons, vibration feedback (Dual Shock), plus both turbo & normal modes. With super control and durability and thumb-controlled analog sticks, this user friendly and easy to install Plug and Play pad is ready for immediate gaming action -- no calibration needed.


text:
Pavel Osipovich Sukhoi (Russian: Павел Осипович Сухой; Belarusian: Павел Восіпавіч Сухі) (July 22, 1895, Hlybokaye – September 15, 1975) was a Belarusian Soviet aircraft constructor and designer.
Sukhoi was born in Hlybokaye near Vitebsk, a small town in Belarus. He went to school from 1905 to 1914 at the Gomel Gymnasium. In 1915 he went to the Imperial Moscow Technical School (today known as BMSTU). After World War I broke out, he was drafted by the army; in 1920 he was demobilized because of health related problems and he went back to the BMSTU, graduating in 1925.
In 1925 he wrote his thesis named Chasseur Single-engined aircraft of 300 cv under the direction of Andrei Tupolev. In March 1925 he started working as an engineer/designer with TsAGI (The Central Aerohydrodynamic Institute). During the following years, Sukhoi designed and constructed aircraft of world renown. Examples include the heavy bombers TB-1 and TB-3. In 1932 he was assigned head of engineering and design department in TsAGI and in 1938 he was promoted to head of the department of design.
In September 1939 Sukhoi founded an independent engineering and design department named Sukhoi Design Bureau (OKB Sukhoi). Located in Kharkov, Sukhoi was not satisfied with the geographical location of the OKB. The OKB was isolated from the scientific pole of Moscow and insisted that the OKB would relocate to the aerodome of Podmoskovye. The relocation was completed in the first half of 1940. In the winter of 1942 Sukhoi encountered another problem — since he had no production line of its own he had nothing to do. He had developed a new ground-attack plane, the Su-6, but Stalin decided that this plane should not be taken in production, in a favour of Ilyushin Il-2. The reasons for this were that, first: the production of the other planes would slow down and in time of war this was not good, and second, Stalin didn't seem to particularly like Sukhoi.
The aircraft-bombers developed under Sukhoi are the Su-17 and the Su-24. The last fighter Sukhoi designed was the T-10 (Su-27) but he did not live to see it fly. On December 25, 1975 the President of the Academy of Science of the Soviet Union posthumously decorated Sukhoi with the golden medal, in recognition of his deep scientific scholarship.
Leaders (before 1168 · 1168–1917 · 1922–1991 · 1991–present) · Metropolitans & Patriarchs · Saints
RSFSR leaders · Soviet Premiers · Soviet heads of state (First Ladies) · Prime Ministers · Foreign Ministers
Prosecutors General · Field Marshals · Soviet Marshals · Admirals · Aviators · Cosmonauts · Explorers
Scientists (Astronomers & Astrophysicists · Biologists · Chemists · Earth scientists · Historians
Linguists & Philologists · Mathematicians · Physicians & Psychologists · Physicists)
Inventors (Aerospace · Electrical · IT · Naval · Weaponry)
Architects · Artists · Ballet dancers · Composers · Opera singers
Writers (Novelists · Philosophers · Playwrights · Poets)
Full article ▸
The article content of this page came from Wikipedia and is governed by CC-BY-SA.


text:
We only
work with The Best
Our Partners
We are extremely discerning about who you work with. After all, your team is only as good as its weakest team member. It is for this reason that we only work with the best. We are extremely proud to say that we are strategic partners of Huawei and more.
IBM Partnership
FINALOGIC Business Technologies has participated the "IBM Global Entrepreneur"" and is now official partner of IBM. Additional to the open source solution FINALOGIC offers its mobile payment solution in the IBM Websphere/DB2. The programm of the IBM Global Entreprenuer supports innovative start-ups that are developing intelligent technologies.
Huawei and FINALOGIC collaborate to offer Agile Stadium Solutions
30.7.2014 - Huawei and FINALOGIC collaborate to offer Agile Stadium Solutions BEIJING, Jul 30, 2014 (PR Newswire Europe via COMTEX) - Huawei, a leading information and communications technology (ICT) solutions provider, today announced a partnership with FanPlay, a cloud-based digital content service provider that is part of FINALOGIC Business Technologies, to launch agile stadium solutions that support high-speed wireless connectivity and value-added mobile services at stadiums and professional football clubs in Europe. With these solutions, stadiums and football clubs can adopt new business models by using a smart device business platform to enhance the experience of football fans that watch games at stadiums. FINALOGIC is currently developing FanPlay - the Fan Engagement Platform.


text:
With his coalition at loggerheads over a new budget, the Israeli prime minister answered weeks of intense speculation on Tuesday evening when, in a televised press conference, he called for government to be dissolved in order to prepare for early elections.
Given his government has been unable to agree a national budget, Mr Netanyahu announced: "I have therefore decided, for the benefit of Israel, to hold elections now and as quickly as possible."
The vote could is likely to be held in late January or early February next year.
Financial issues aside, the timing of these snap elections, called at the height of concerns over Iran's nuclear intentions and the week after Mr Netanyahu drew a "red line" on the issue at the United Nations General Assembly, ensures security will dominate the campaign.
Mr Netanyahu's announcement follows a week of crisis talks with party leaders within his coalition, including Eli Yishai, Israel's interior minister and head of the ultra-orthodox party Shas.
It was Mr Yishai's rejection of a broad range of budget cuts proposed by the prime minister, which he argued would hit single parent, poor and elderly households hardest, that prompted this fatal rupture in the coalition's stability.
Reuven Rivlin, the speaker of the Knesset, delivered a speech to the Israeli parliament on Thursday requesting that government disband. He referred to a consensus among Israel's political parties that early elections were essential to tackle the country's budgetary crisis.
Israel must cut its budget by £2.7 billion to stay within the fiscal limits established by Stanely Fischer, the governor of the Bank of Israel in August.
"We are in a global financial crisis that threatens to sweep up Israel, and without a 2013 budget, there will be disastrous consequences for the socioeconomic situation and for weaker segments of the population," Mr Rivlin said.
According to a poll conducted by Israeli newspaper Ha'aretz and published on September 28, 35 per cent said they consider Mr Netanyahu the country's most suitable leader.


text:
As interesting and exciting all the news for the upcoming POWER RANGERS film is, I'd be lying if I didn't say its quality is sort of a bit question mark. Sure, I loved the series as a kid — and POWER RANGERS has gone on to win kids over for over two decades now with all its iteration. That being said, there's no denying it's a campy product. What approach would they be taking with this new film? Would it be darker and grittier, or would it embrace the tone of the series?
In a recent interview with actor Bryan Cranston, who was recently confirmed for the role of Zordon, he praised the film for its approach, going so far as to compare it to the way Batman evolved from the 1960s series to THE DARK KNIGHT TRILOGY. It's also worth noting that Cranston has some actual experience working on the TV show as the voice to a couple of villains back in 1993.
Here's what he had to say to the Huffington Post:
"At first I was, to be honest with you, I was reticent to looking at the role because I remember the television series was kind of farcical and silly and 'pow' and 'zow' — weird movements and things like that. I was like,'Oh, OK.'
I wasn't really high on it until I talked to the producer and read the script and talked to the director. After that I went, 'This is different.' This is as different a reimagining as the BATMAN television series as it became the [DARK KNIGHT] movie series. You can't compare those two, and nor can you compare this movie version of the POWER RANGERS to that television series. It's unrecognizable for the most part. There are tenets of the folklore that you hold onto for sure, but the inspiration is different, and the sensibility of it, and the approach to the film making is completely different.â€
Cranston went on to clarify his comparison to the DARK KNIGHT — by no means is the POWER RANGERS film anywhere near that series as far as tone goes.
"I don't know if the tone is as dark as that because you're dealing with teenagers. So the appropriateness of that, and real teenage life, and going through high school and the cliques and the popularity or lack thereof, and the bullies and all the different sections and sub-sections of high school life, and the insecurities of these kids and things like that — hopes and dreams — and you embrace all of that into a retelling of the POWER RANGERS. And what you would get is this new version, this new reimagined version.â€
This all sounds pretty great to me. As a fan, I'd like to see a healthy adaptation of the show, not just a re-hash. I'd like it to take advantage of its larger budget and wider audience, and it sounds like this is the exact approach they're taking.
What do you think? Are Cranston's words encouraging to you? Let us know all your thoughts down below in the comments!
POWER RANGERS hits theaters on March 24, 2017.
Don't forget to share this post on your Facebook wall and with your Twitter followers! Just hit the buttons on the top of this page.
SOURCE: Huffington Post


text:
Most web designers aren't very familiar with SEO (Search Engine Optimization), which is the process of ranking specific web pages as high up in the SERPs (Search Engine Result Positions) as possible. It's understandable, web design and SEO are only loosely connected. The only time when SEO enters the mind of a web designer is usually when they're writing the HTML and considering the relevant tags to use. It's also understandable because most web designers work with local clients, or have other ways of finding clients.
But it's very possible to use SEO to find web design clients if you know what you're doing. I know this because it's how I've worked for over 1,500 design clients in the past 3 years. Unlike most designers, nearly 99.9% of my clients are located in different states and countries. Many freelance designers unnecessarily struggle month to month due to a lack of consistent income. If you're one of those starving designers, keep on reading!
My Personal Story
Over 4 years ago when the popular social site Digg.com started getting popular, I wanted to see if I could produce a design tutorial which could gain enough "diggs" to hit the front page. Why? I don't know, I think it was just to see how much traffic I could get if my tutorial actually did hit the front page. So I spent a few hours writing a detailed tutorial on how to design a logo. I submitted it and a couple hours later I checked on it and low and behold, my tutorial hit the front page. Visitor total came in at around 13,000 unique visitors. Pretty cool, but I wasn't monetizing my site at all.
Now let's fast forward 8 months later. I wasn't making much consistent income and I was about to move out. My last resort was to work as a designer under some random company remotely, which I didn't want to have to do (I was always of a freelancer mindset). I checked my website stats one day and I was receiving over 800 visitors daily. Mind you, I thought this site was dead. After looking into it, I was ranking very high for certain logo design related keywords in Google. People who wanted to design their own logos were ending up at my site, hundreds of them daily.
I was curious at the time, how exactly did ranking on digg translate into #1 / #2 / #3 rankings in google for a variety of related keywords? After looking into it, the exposure I gained from hitting the front page of digg.com made the tutorial visible for other websites and site owners to link to. I received hundreds of different backlinks (other websites linking to your page) from hundreds of other websites. And because my tutorial title had logo design related keywords in it, that was the anchor text those websites used when they linked to my site. One of the most important factors Google uses to determine which keywords to rank a given page for is the anchor text of the backlinks a page is receiving.
After this realization of receiving a decent amount of traffic, the rest was history. That month I built an ordering system in which people could order logos for a measily $75.00, and the next month I made nearly $3k. It turns out people who want to design their own logo soon realize it's not for them and ended up ordering from me instead. What's even better about this story is that was over three years ago and I've still maintained those rankings; that tutorial is still generating clients. It turns out that once you receive a high ranking in Google, it generally lasts for years.
SEO Basics
So now that you know it's fully possible to make a decent living (in fact you can make an awesome living) from search engine rankings, let's cover some SEO basics. The task of performing SEO is split into two parts.
On-site optimization
On-site SEO is something you should already be familiar with as a web designer. It's the proper usage of all of the HTML elements on your site, along with keywords. Every entrance page on your site (usually your home page, articles, etc..) need to be focused towards specific keywords. The keywords you choose to target need to be placed in critical sections of the HTML. The meta tags (description and keywords), the title tag, head tags (H1, H2, H3 etc..), alt tags, etc.. are all the most important places in which keywords need to be placed. Don't spam the keywords though, you want to use your keywords naturally, otherwise google will penalize you and make ranking difficult.
On-site optimization always involves the process of creating a solid interlinking structure within your site. Whenever possible and wherever relevant, you want to link your visitors to other pages on your site. And you want to link them with proper anchor text (the primary keyword that the article is associated with).
On-site optimization is the easiest half of SEO. They're all variables which you can control. Back in the 1990's, search engines were very ineffective at providing reliable results because they only relied on on-site variables to rank web sites. All you had to do was spam your keyword in your html and you would receive top rankings. Google's success came from taking into consideration off-site optimization in order to provide better results.
Off-site optimization
Off-site SEO is all about other websites that link to you. There are a many factors that go into off-site optimization. Google wants you to receive those backlinks in natural "white-hat" ways. Google is always at a constant battle with SEO Black Hats (you know, the guys that keep spamming your wordpress blog). The method I described above in my own story is considered white hat because the tutorial spread naturally and other websites willingly linked to it.
The most important factors of effective off-site optimization are:
1. Relevance
When Google indexes a website and all of its pages, it automatically categorizes that website and each individual page into a specific niche based on the content it finds. If a website about shoes links to your website about web design, less weight (ranking influence) will be given to that link.
2. Authority
Several factors of a website determine the authority it has. Age, content, and the amount+quality of backlinks it receives make up authority. If you receive a backlink from Google.com, it will play a much more significant role in your ability to rank for a keyword than if you were to receive one from your mother's blog.
3. Anchor text
We all know this is anchor text. Even more important than the surrounding content on the page you're receiving a backlink from is the anchor text. It's why it's very important to place your target keyword in the title tags of your page. There are many automated systems like vBulletin for instance, that will replace the URL of a page with the title tag for the anchor text.
You must also choose your keywords correctly. If you think you're going to rank for a keyword like "web design", think again. While it's possible, you're going to be up against some very experienced SEO experts who are constantly trying to improve rankings. If you're just starting out, go after more targeted niche keywords. There are a whole slew of applications and web based services that are based entirely around finding good keywords which I've linked at the bottom of this article.
Onto the good stuff…
Now that you have a basic understanding of what SEO is and how search engines rank websites, I'll give you some great ideas that you can begin implementing in order to find design clients through SEO.
• City, State + "Web Design", "Web Designer", "Print Design", etc..
This is the most obvious option. Let's say you're from Phoenix, AZ. People in Phoenix who want a website designed are searching google right now trying to find "phoenix web designers", or "arizona web designers", or "phoenix az website design". Make sure either your home page, or a page on your site is geared towards these city+state+topic keywords. And then make sure you get backlinks from other sites with those keywords as anchor text. It's that simple.
• Contribute content to other websites
You write an article, a tutorial, a guide or whatever exclusively for another website, that website will usually allow you to link to your website from within that article. 1-way backlinks (a link you receive that you do not reciprocate) hold a lot of weight.
• Write your own awesome content
It's the formula I used in my story above and it works great as long as the content is good and it can receive exposure. Submitting it to the popular social bookmarking sites is a must if you don't already have a lot of traffic. Digg, reddit, del.icio.us, stumbleupon are all great for this method. You can also submit it as a tip to sites like this and they may feature you in a roundup article. You just have to remember that you have a target keyword, and that it's mentioned enough throughout your content, especially in the most critical areas like the title and h1 tag.
• Contribute Freebies
As a designer, you're capable of designing stuff that everyone wants. Icon sets, wordpress themes, website templates, button designs, background patterns. These are all things you can design and then contribute and spread on other websites. Iconfinder is a huge site where others can find tons of free icons. You can contribute your own icon set and require people who use any icon link back to your website. If you design an awesome wordpress template, you can submit it to free wordpress template directories or even get it mentioned on huge sites like this one. How do you get a backlink from that? Simple, place a link to your site in the footer of the template!
• Get Niche
Let's say you have a particular talent in designing something very specific, let's say you're great at 3D logo design. If your site is all about 3d logo design (the keyword even in the domain name, articles about 3d logo design, etc. etc.) it's going to be a lot easier for you to rank and start receiving traffic than it is if your site is just about "logo design" in general. Remember what I said earlier, the more niche a keyword is, the easier it will be to rank because chances are, there's less competition.
• Help Others
Every backlink counts. Backlinks are the single most important ranking factor after you have your page up and running. If you hang out on design forums, or you like helping answer question on Yahoo Answers, you can find opportunities to mention your link where it can help others. Search engines crawl pages regularly, and when they find your link on a new page, it's only going to help.
Using just one or two of these methods can push you to the top of the search engines for a keyword, which can result in loads of new clients every month.
SEO is an entire industry in and of itself, so it may take time to get a firm grasp. The list above should help you get your feet wet. My advice is to start small. Try getting your site to rank for the city you live in + whatever area of design you're in, like "city website design", "city state web designer". Once you start receiving traffic and clients, you'll understand SEO can be a great way to find clients as a freelance designer.


text:
Our NHU Community Forum is filled with support from people who may have shared similar experiences as you. Reading their stories may assist you. Our NHU Community Forum offers a comprehensive group of Topic Discussion Boards that provide an on-line community for you!
Scroll down and click on the topic or subject of your choice on the NHU Community Forum and Topic Discussion Boards
Cannot decide on which board to post your message?
Do not worry! Post your message on the Get Started! - Share What's on Your Mind forum. If we feel your post will do better under another, we will move your message to the appropriate board.
Go now to the NHU Community Forum!
|Home / Disability News / NHU Quarterly Newsletter
|Share Your Knowledge! / NHU Community Forum / Contact Us
|About NHU / Announcements and Features / Contribute / What's New? / Site Plan


text:
Hours : Monday-Friday
8:00am - 4:00pm Pacific
Please enter your email address and password in the boxes below then click Continue.
Forgot your password? Click here.
Click on the link to create a new account. After completing your registration, you will be able to complete your order.
Your Online Source for Genuine Subaru Parts and Accessories and Gear!
DiscountedSubaruParts.com • 888-530-6652 • Contact Us
Walker's Renton Subaru
© 2015 Seven Motor Corp. d.b.a.
Please waiting, getting message.


text:
If you would like to link to ShoppeCharlotte.com please use the following text link or graphical link. If you need a customized size graphic, please Email Us for specifics.
We appreciate your interest in our site. Thank you!
|Website Design / Website Hosting | Contact Us | Home
Contact Us | Link To Us | Charlotte Website Design - Request A Quote! | Disclaimer
© Copyright ShoppeCharlotte.com Charlotte, NC Website Solutions, Custom Web Design and Online Local Charlotte Advertising


text:
I know a lot has been written on the topic. You can read all about it via this Google search.
It is impossible to have a set of social media guidelines, that work for all scenarios. New fails and faux pas keep showing up, even from experience people and established brands. All we can do is minimize them, educate ourselves, and well… hope for the best! 🙂
The reason there is room for each of those apparently repetitive points, is:
- Social Media is subjective.
- People have varied opinions.
- One man's misery is another man's fortune/delight.
- Subjective things are mood-dependent.
- Cultural, geographical, racial, gender related, and other such differences are difficult to figure out, fathom, prevent, plan for, and mitigate.
I could go on and on, but you get the gist. I have shared my condensed experience at http://list.ly/list/EnJ-what-to-do-on-social-media-channels-to-prevent-social-media-fails.
Leave a comment on what your experience says.