aboutsummaryrefslogtreecommitdiffstats
path: root/posts/elm-everything-broken.md
blob: 8fa968206b3531e3ecf3637bb04b77bd4b77c7c7 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
Title: Everything Is Broken (Elm Install Edition)
Author: bnewbold
Date: 2016-05-06
Status: draft

*This post is mostly a rant about my problems getting a fancy new programming
language to work on my laptop.*

A few folks at the Recurse Center had nice things to say about the [Elm
programming language](https://elm-lang.org), and after watching Evan
Czaplicki's ["Let's Be Mainstream" talk](https://www.youtube.com/watch?v=oYk8CKH7OhE)
I got pretty excited also.

So, I thought, Let's try elm! First place to head is the install page:

[http://elm-lang.org/install]()

Hrm, i've had painful experiences with `npm` in the past, so i'll try build from
source.

[https://github.com/elm-lang/elm-platform]()

Weird, build from source directions involve some curl-to-file thing. Why not
just clone the repo and have a makefile? If you don't know how to clone a repo,
are you really going to know how to get cabal set up, open a terminal and paste
a command, etc? Anyways, I clone repo and run the script from there instead.
I'm on debian stable (jessie), so installing Haskell (GHC) is easy, and there
is a good chance things will just work because this Debian stable is a
reasonably popular developer platform. I seem to have a recent version of
cabal:

<pre class="terminal">
bnewbold@eschaton$ cabal --version
cabal-install version 1.20.0.3
using version 1.20.0.2 of the Cabal library 
</pre>

so I run the `BuildFromSource.hs` script:

<pre class="terminal">
bnewbold@eschaton$ runhaskell ~/src/elm-platform/installers/BuildFromSource.hs 0.16

GHCi runtime linker: fatal error: I found a duplicate definition for symbol
_hs_bytestring_long_long_uint_hex
whilst processing object file
/home/bnewbold/.cabal/lib/x86_64-linux-ghc-7.6.3/bytestring-0.10.6.0/HSbytestring-0.10.6.0.o
This could be caused by:
* Loading two different object files which export the same symbol
* Specifying the same object file twice on the GHCi command line
* An incorrect `package.conf' entry, causing some object to be
    loaded twice.
GHCi cannot safely continue in this situation.  Exiting now.  Sorry.
</pre>

Uh-oh! Not sure what that means. A search returns this:

[https://wiki.haskell.org/GHC/FAQ#Duplicate_Definitions]()
    
Doesn't seem like *I* have done anything wrong. I'll update `cabal`:

<pre class="terminal">
bnewbold@eschaton$ cabal update
Downloading the latest package list from hackage.haskell.org
cabal: Failed to download
http://hackage.haskell.org/packages/archive/00-index.tar.gz : ErrorMisc "Error
HTTP code: 502"
</pre>

I assumed I was doing something wrong, but it turns out that the Hackage
package repository [is down](https://status.haskell.org/):

    hackage.haskell.org down    Full Service Disruption
    [Investigating] The hackage server is in an out of memory condition. We're investigating.

Hrm. Well, wasn't even sure if that would fix the problem. I'll give up and try
`npm`, which these days has been "partially" packaged in Debian. I'll just
uninstall `npm` when i'm done installing Elm. I install with apt (which pulls
in a huge list of nodejs packages), but then can finally run:

<pre class="terminal">
bnewbold@eschaton$ npm install elm
|
> elm@0.16.0 install /home/bnewbold/bin/node_modules/elm
> node install.js

sh: 1: node: not found
npm WARN This failure might be due to the use of legacy binary "node"
npm WARN For further explanations, please read
/usr/share/doc/nodejs/README.Debian

npm ERR! elm@0.16.0 install: `node install.js`
npm ERR! Exit status 127
npm ERR! 
npm ERR! Failed at the elm@0.16.0 install script.
npm ERR! This is most likely a problem with the elm package,
npm ERR! not with npm itself.
npm ERR! Tell the author that this fails on your system:
npm ERR!     node install.js
npm ERR! You can get their info via:
npm ERR!     npm owner ls elm
npm ERR! There is likely additional logging output above.

npm ERR! System Linux 3.16.0-4-amd64
npm ERR! command "/usr/bin/nodejs" "/usr/bin/npm" "install" "elm"
npm ERR! cwd /home/bnewbold/bin
npm ERR! node -v v0.10.29
npm ERR! npm -v 1.4.21
npm ERR! code ELIFECYCLE
npm ERR! 
npm ERR! Additional logging details can be found in:
npm ERR!     /home/bnewbold/bin/npm-debug.log
npm ERR! not ok code 0
</pre>

Looks like Debian wants to call node.js `nodejs` while npm/Elm expects it to be
called `node`. Ok, I create this shim named `node` in my ~/bin directory (which
is on my $PATH), and make it executable[1]:

    #!/bin/sh
    nodejs $*

Now I can do things like:

<pre class="terminal">
bnewbold@eschaton$ node --version
v0.10.29
</pre>

Great! Now let's install elm:

<pre class="terminal">
bnewbold@eschaton$ npm install elm

> elm@0.16.0 install /home/bnewbold/bin/node_modules/elm
> node install.js

Downloading Elm Reactor assets from https://dl.bintray.com/elmlang/elm-platform/0.16.0/elm-reactor-assets.tar.gz
Error communicating with URL https://dl.bintray.com/elmlang/elm-platform/0.16.0/linux-x64.tar.gz Error: CERT_UNTRUSTED
npm WARN This failure might be due to the use of legacy binary "node"
npm WARN For further explanations, please read
/usr/share/doc/nodejs/README.Debian

npm ERR! elm@0.16.0 install: `node install.js`
npm ERR! Exit status 1
npm ERR! 
npm ERR! Failed at the elm@0.16.0 install script.
npm ERR! This is most likely a problem with the elm package,
npm ERR! not with npm itself.
npm ERR! Tell the author that this fails on your system:
npm ERR!     node install.js
npm ERR! You can get their info via:
npm ERR!     npm owner ls elm
npm ERR! There is likely additional logging output above.

npm ERR! System Linux 3.16.0-4-amd64
npm ERR! command "/usr/bin/nodejs" "/usr/bin/npm" "install" "elm"
npm ERR! cwd /home/bnewbold/bin
npm ERR! node -v v0.10.29
npm ERR! npm -v 1.4.21
npm ERR! code ELIFECYCLE
npm ERR! 
npm ERR! Additional logging details can be found in:
npm ERR!     /home/bnewbold/bin/npm-debug.log
npm ERR! not ok code 0
</pre>

This github issue seems to have some tips:

    https://github.com/elm-lang/elm-platform/issues/100

The recommended solutions online are basically "upgrade node.js and npm" or
"disable SSL security". That doesn't sound great, but i'm feeling very
impatient at this point so I try disabling SSL checks with `npm config set ca
null`, but even with that I get the same certificate error. Enough of that
approach:

<pre class="terminal">
sudo apt remove npm nodejs-legacy nodejs
rm ~/bin/node
</pre>

Poking around a bit more, I find the `fubar.sh` script in the `elm-platform`
repo, which seems to nuke the local user's Haskell (cabal) stuff (not
system-wide package, eg apt managed GHC libraries). After running that the
`BuildFromSource.hs` seems to start working, though Hackage is still down (now,
an hour after I started this process, at 5 hours total downtime), so I can't
install dependencies.

I search for a hackage mirror and find that [FPComplete runs
one](https://www.fpcomplete.com/blog/2015/03/hackage-mirror).  In addition to
their directions I had to set `remote-repo-cache` in my `~/.cabal/config`, like
so:

    remote-repo: hackage.fpcomplete.com:http://hackage.fpcomplete.com/
    remote-repo-cache: /home/bnewbold/.cabal/packages-fpcomplete

After that I `cabal update` and run the `BuildFromSource.hs` script again. It
fails to build the dependency `websockets-snap`, but I try installing that
regularly (`cabal install websockets-snap`) and that works, then all the
dependencies with BuildFromSource.hs build. Yay!

I still get an error with compiling Elm itself though::

    src/Elm/Package.hs:60:25:
        Not in scope: `<$>'
        Perhaps you meant `</>' (imported from System.FilePath)

It [sounds like](https://github.com/elm-lang/elm-platform/issues/30) I am using
an out of date version of GHC (the Haskell compiler): I have 7.6.3 (the version
that comes with Debian), and Elm wants 7.10. Fair enough: unlike a package
manager, I can see how new features in the compiler would be helpful, and when
I go back and look this is in the README. Fortunately there is a new version of
GHC in the jessie-backports repo, so:

    sudo apt install -t jessie-backports ghc
   
And now::

<pre class="terminal">
bnewbold@eschaton$ cabal --version
cabal-install version 1.22.6.0
using version 1.22.5.0 of the Cabal library 
bnewbold@eschaton$ ghc --version
The Glorious Glasgow Haskell Compilation System, version 7.10.3
</pre>

After that, i'm miraculously able to compile. Horray! I add
`~/bin/Elm-Platform/0.16/.cabal-sandbox/bin` to my `$PATH` and I can run:

<pre class="terminal">
bnewbold@eschaton$ elm-repl 
---- elm repl 0.16.0 -----------------------------------------------------------
:help for help, :exit to exit, more at <https://github.com/elm-lang/elm-repl>
--------------------------------------------------------------------------------
> 
</pre>


Also, through out this debugging experience i've had problems with my external
Lenovo Thinkpad USB keyboard glitching (workaround: unplug and replug) and with
WiFi here at the Recurse Center disconnecting (other have the same problem,
something to do with wireless regulatory zones, but we don't have a fix yet).

It's not all hard though; installing the `elm.vim` syntax highlighting plugin
is very easy, just a single `git clone` into ~/.vim/bundle/`.

[1]: later I learn that I could instead have installed the `nodejs-legacy`
     package, which just installs a symlink `/usr/bin/node` which points to
     `/usr/bin/nodejs`.

================

- ironically, elm packaging seems to have some nice features to prevent
  breakage
- also, rust packaing seems good (link to cargo post)

================

**Follow up June 18th, 2016:**

A new version of Elm (0.17) was 
[released](http://elm-lang.org/blog/farewell-to-frp)
was released a few days after writing this post. The new version made some big
changes, like abandoning the Functional Reactive paradigm. I found that many of
the new tutorials weren't working with my 0.16 install, so I tried to upgrade.
After an hour or two of following the directions above, I gave up and installed
`npm` on a temporary Debian unstable ("sid") virtual machine. Once I added a
`node` symlink to `nodejs`, I was able to install `elm` with `npm` and develop
remotely using `screen` and `elm-react`. Frustrating!

Also, `https://status.haskell.org` seems to be broken again today, though
hackage itself seems to work.