Packaging electron for other users

Notes from a small Laptop…

Finding instructions for packaging election apps turned out to lead me, moment by moment, inexorably through the madness that is youtube. So, here is my typed version of Things That I Did, picked up from youtube and https://ourcodeworld.com/articles/read/365/how-to-create-a-windows-installer-for-an-application-built-with-electron-framework .

First of all, I moved all electron-based folders into an electron workspace. Into that workspace I hit npm install electron-winstaller.

Then

cd whatever-your-app-folder-is

and

npm install electron-squirrel-startup

and wait a bit. Now is a good time for a cup of tea. Frankly any time is a good time for a cup of tea, but during downloads and installation you should be stretching your legs anyhow.

Now we alter the main.js file to handle events from squirrel.

After the const app module to control application life, we add some code snippets from ourcodeworld.

Then we find a link to electron-packager, and then we cry.

So…

npm install electron-packager -g // The -g switch gives us a global install

We roll back npm 5.3.0 to 5.2.0 because otherwise the build breaks.

npm i -g npm@5.2 // On my ARCH installation I tried out 5.4 instead. Results as yet unknown.

We add a script to package.json and we run it, and it works, and we launch the app, and it dies.

Well, crap.

OK, so there are unexpected tokens, which means it’s borking on the not-JavaScript bits, which means it needs to be part of Webpack. So we use webpack-electron-packager instead, and there are tutorials for that so here, gentle reader, I leave you.

GNU Embedded Toolchain for ARM on Rasbian Jessie Lite

Shoot me. Shoot me now.

And if you don’t, don’t blame me.

~~~

I dislike GUIs for holding my coding environment, because they present me with new and therefore terrifying technology. So, I elected to put the mbed cli onto Raspbian Lite. This is already devoid of a GUI, and nothing could go wrong.

Gentle Reader, it went wrong. Mostly because the instructions for compiling from source were in a pdf which I couldn’t read without downloading it elsewhere, and by the time I had done that the schnapps I was taking medicinally had betrayed me.

Once I’d opened that, the instructions started with ‘install Ubuntu’ so I swore a bit and didn’t install Ubuntu. But I did apt-get install software-properties-common and that nearly worked. I didn’t have 7z on Rasbian Lite, and when I managed to get p7zip, I had to amend ./install-sources.h by hand, to take out mentions of 7z and add p7zip -d which got me to the point where I had everything installed and could start the build. At which point, more stuff broke.

‘This does not look like a tar archive’ is a bad message to get when you believe you are messing with tar archives. So, it was into build-common.sh to have a look-see.

I had a curious error that tar -cf – . which should – I thought – have compressed stuff, wasn’t. As far as I could read from the error message it was decompressing instead. Obviously I was not drunk enough. But there was a failure to find zlib, and that was the only thing that was compressed as a .tar.gz instead of a .tar.bz2. So I could do that by hand, right?

cd src
tar -xf zlibwhatever
cd -

Now we’re cooking with Calor.

Until there’s no usable m4 in $PATH. And I have no idea what m4 is.

So I install that:

apt-get install m4
sudo !!

!! is the most useful shortcut I have ever found. It’s the entire last line you typed. sudo !! is the thing I probably type most.

Then I attempt another build. I’m on a roll here!

./build-rerequisites.sh

And I wait. Clouds of text pass upward. My pi light blinks. I drink more. More scroll happens. I have no desk. I have no keyboard. The world is an illusion. I experience sudden horror as the scrolling stops but it is only a momentary pause for a large file. I recognise fragments of names. The word ‘pedantic’ catches my eye and I laugh. The ‘caution something or other about make check’ board scrolls past. I drink again. Makefiles are made. I hug the bottle. The scrolling is giving me a headache. Or else I am hung over. The lighting waxes and wanes as text pauses and passes on. I am at one with the Schnapps. The Schnapps is at one with me, but is also precariously balanced on the tin of shoe polish I am using as a coaster. Now we are checking the locale and it isn’t saying Drowned Ys or Property of Randolph J Carter, so I think we’re OK. ‘Making all in .’ is a travesty of grammar, but a wonderful statement from the command line. More drink. Sacrifice a goat to the old ones. Eat raw goat liver. I finish a conversation online and start another. The dragons drift by. I click things with a useless mouse. There is more scroll. The C compiler works. We check together, the computer and I, whether we are cross-compiling. … And then .configure aborts.

‘Compiler error reporting is too harsh for ./configure (perhaps remove -Werror).’

Well, there’s lovely.

I don’t know how to remove that, because I don’t know why or where it was set in the first place. Somewhere in the haze of alcohol I remember that I must already have the GCC working to make all this stuff, and I sigh and look up the error message because that’s the sensible thing, and sleeping could stop me from thinking.

A stack exchange discussion of this problem has something that cheers me up. “The compiler is too harsh simply because there is no compiler…” At least my problem is not that.

In looking up what might be going wrong I have scrolled away from the error messages and I don’t want to look for logs so I run this again. There is a pleasing object with the word polyhedron in the file name. And now we have found warnings. Makefile.in seems to ignore the datarootdir setting. Is that bad? And then a bit of scroll later we bork.

I read back up a bit. pushd allows one to play with the directory stack. So in one of those directories, perhaps, there is a ./configure.

ls build-mingw/zlib has a configure file. There is a configure log. The configure file tells me that
try
:
else .

So now I try to remember what try means. I scroll up to find what options $CC has. The irony of me doing the scrolling makes me smile. I have the horrible feeling that this is using CC not GCC and I have no idea what that means. The bottle is calling me again. I comment out the line that is forcing me to leave, because errors are fine because it is midnight and I am drunk. I do not expect this to go well, but I am interested in what will work. Probably that file will not be regenerated and this is all safe. Perhaps I should have checked at least the start and end of the configure log before I began. The cloud scrolls past again. I can smell hamsters. long long ints exist. doubles exist. I play with the refresh rate of the scroll by blinking. I converse online about novelty fish. I open up a different terminal to rest my eyes. I scroll back in time to find out that CC=gcc. I reach the point where we make all in . The tension is acutely bearable. I have no expectations. Hope is a deceiver. I lie to myself about not hoping. The conversation about novelty fish turns to gravel and rakes. I consider Phlebas, who was tall, and is now dead. I consider how I could have learned to get along with a GUI, but no, I had to do it my way. I look lovingly at the screen, now showing me built objects that will die when ./configure fails. I love these things. They do not know that hopes are liars. Maybe once I was like them.

Everything dies. I look up the ./configure, and sure enough it’s a generated file so I cannot change it. I’ve learned a thing. I look in the configure log and I’m apparently building some cross-compiling something-or-other for the windows toolchain so I re-start without that. I can live without windows. The pain of the GUI is enough that I am doing this to avoid windows.

./build-prerequisites.sh --skip_steps=mingw32

The temperature warning for the Pi comes on. I blow over the CPU, with the tenderness of Achilles teasing Patrokleos. The air is warm. I have enclosed the main board in too many breakout boards.

The objects are created again. They never complain about this. The temperature warning has not returned. .io files click in orderly procession down the screen. More scroll. Is this further than I have gone before?… exit 0. No errors. The little coloured directory indicator is a checkpoint flag. They are playing my tune.

Ladies and Gentlemen, we are halfway!

./build-toolchain --skip_steps=mingw32 holds no fears for me now. I believe!

I take a moment to marvel at the complexity of the compiler building a compiler. So many people worked on this. Hardly any of them need to be destroyed. I blow on the CPU again. I wonder if I have built this in the wrong place. Awww. Error 2. recipe for target failed up above somewhere. I can hear the Glory. I should probably sleep. The Pi can cool down overnight.

Dear reader, I came back to it in the morning, and tried again with TeX installed. Why TeX, I do not know. It seems to have been making make all fail, even though it was almost certainly optional in the minds of the writers. I added flex to give me gengtype-lex.c, and ran into what was probably a memory issue. So, I increased the swap file from 100MB to 400MB. df –total showed that I still had 10% of my space free. (At this point, I decided to build the toolchain on my desktop machine as well, to find out if it was just the Pi being awkward. It’s the Pi being awkward, *and* I failed to build on ARCH.) I installed bison, and increased the swap file to 800MB. The temperature warning light stayed on, meaning that the CPU was being throttled. However, finally, I ran out of space on the device. One last gambit was to decrease the swap file to 600, because I didn’t know if the installation of bison could fix the earlier issue. Again, I ran out of space. More in next week’s exciting episode, folks.

My Little Pi-ny

Dev Machine
Here’s the development machine. I love hardware that folds down almost as much as I love free hardware that I picked up because someone else didn’t need it, and this is a blend of the two.

Everything I have in this photo fits into the official touch screen box, along with a chunky battery and a spare USB lead for power. It’s a Pi 3 with blinkt hat, touch screen, Rii-diculously small keyboard on which yes, I genuinely type, and two Fold Holds (by Jonathan Woolf) to hold it all up and protect the screen when it’s packed. You might say the touch screen is overkill – I don’t have a GUI on the machine.

I’m going to design a hat to go on top, which will be able to fly out the unused pins currently covered by the blinkt, giving me breadboarded GPIO access. Nothing could possibly go wrong with that plan.

Lasers

A while back I decided for safety reasons not to put laser cutting capability onto my Art Bot. So, the laser and heatsink bundle arrived today. I’m going to be messing with the voltage and current using a dummy load (also bought that, rather than scraping it together) and nothing could possibly go wrong.

I’ve already written the software.

Hollow Victory

I recently decided I needed to be able to convert raster images to vectors in my software so I could drive Itchy the Artbot. I looked up OpenCV as a way of comprehending computer vision, because it was the only thing I had heard of.

Apparently ‘vector’ and ‘std::vector’ are different things.

This was an error of ignorance that I could only put right once I’d learned enough C++ to feel I could go back to the OpenCV help files. So, I spent a month getting to the point where I could find out I shouldn’t waste time on this. Fucksake.

Itchy: Victory

A block of wood with a distorted silver circle drawn on itLast night I put everything together. The tool chain is now clear. I learned what ‘tool chain’ means from Co-Squidly. It was a word I knew but had never really respected, and now I do. So, here’s the flow:

  • Generate paths in Inkscape
  • Inkscape -> Extensions -> GCodeTool -> Path to GCode
  • Clean Gcode – inkscape uses (comments like this) and gcode needs ;comments like this
  • Import to bCNC (python GUI to send gCode)
  • Send to Arduino
  • Magic happens. Stuff moves!

The silver circle on the wood above was drawn in inkscape and sent to the machine where it was drawn with a Sharpie. I’ve built a machine. I declared tea and victory, and went home.

My friends have nicknamed it wobblebot. This is not unfair. It needs a lot of work, but it’s what I was after.

Itchy: leaps and bounces

All of Itchy’s parts work individually, and Co-squid found a tool chain that will drive the Arduino from output from Inkscape. Inkscape has gcode extensions. Of course it has. So now, I just have to put it together. The machine went from jerky, jumpy bouncing to having some smoothness of movement today.

Co-squid goes back to her house soon, and I’m going to have to work out where to put what I am calling Itchy and she is calling Murderbot. Given the fragment of scalpel I found in the second hand parts, I think it already was a cutter. I’m going to find some way of keeping that bit of scalpel in there.

Itchy: step size solution

The engineer who came pre-installed at our workshop pointed out to me the way to do steppers.

The Arduino can tick over far faster than the stepper driver wants to move. (This may not in fact be true; I went for some rather over-spec stepper drivers. But arguendo, this is the case.) So, I use the smallest size of step, and crank up the tick rate. I can use the Arduino to time the steps so if I want to slow down, I’m just missing out a lot. That restores a lot of the pins I thought I was going to need, and makes me a happy person.

He also had some things to say about end stops and soft stops – he says it’s best to do it in the microcontroller, because that will keep track of the last direction in which you moved. If you try to cut out the stepper controller by over-riding the direction at the same time, you’re going to get a race condition.

Lastly he added the purely mechanical point that you can ramp the head up the cut-out switch rather than risking flattening it coming in from on top, and still have the hard stop beyond the switch so nothing falls off at high speed.