forked from wezm/wezm.net
Compare commits
151 commits
Author | SHA1 | Date | |
---|---|---|---|
3d8ae03a2a | |||
ee4b17e1ca | |||
ed2d4bd2b3 | |||
d4ed662cdf | |||
8c16278ffc | |||
3b2c0dd92d | |||
25b701e10a | |||
1fe0245e1f | |||
3395f3edac | |||
8b7103180c | |||
4e2eeb415f | |||
b16ca174ca | |||
4451d995d4 | |||
531f2fec35 | |||
4b12ad7fef | |||
ab0d9faafe | |||
fe65d4982d | |||
35ad9543a9 | |||
0e5ed74517 | |||
e0209f1456 | |||
0a4f1d2a45 | |||
e00bb7868c | |||
7f389d2055 | |||
0504ad56a3 | |||
ae8277de63 | |||
13a14637e3 | |||
8724d5daa5 | |||
e0bedd3568 | |||
34559284b1 | |||
03cacc6120 | |||
cb659b6780 | |||
229168516a | |||
760f4b20f7 | |||
7a607242dd | |||
19c3abc488 | |||
902b75077e | |||
f0eed29ba7 | |||
8fefeafc48 | |||
1d7d18c0ac | |||
3bcc719e6a | |||
e2d787166e | |||
666a9e1ace | |||
fc0a8acbbd | |||
71f4cfad2e | |||
3474c63eec | |||
ae11983d44 | |||
8bd50ce5af | |||
0d3db0c69d | |||
b86b79c000 | |||
0f85f2165f | |||
dbcea56dd4 | |||
c0f032325c | |||
8a129c1b36 | |||
9a365c6716 | |||
972ea340fc | |||
27f58173d2 | |||
94171be290 | |||
4f04936330 | |||
8acfbbcba6 | |||
59c8c21b14 | |||
4eefa4ff7d | |||
d1c8f9e9a4 | |||
f0e3db2e68 | |||
746c6f2c63 | |||
d5c8f664b9 | |||
7890c07140 | |||
6d9173ab07 | |||
2e45666552 | |||
aff5c4c939 | |||
d3e6114ed1 | |||
a17d8bc9fa | |||
a05086f29e | |||
1c4a9bfd70 | |||
e0cfe47ed4 | |||
9ec0d2e00b | |||
35f7d3568f | |||
b7208e08d1 | |||
739c7cb2ba | |||
09138c0889 | |||
10e0390a94 | |||
cfdd67ec5b | |||
55f4a110a8 | |||
91370548ef | |||
06d887c085 | |||
5c45bdd5f8 | |||
4a69b79d60 | |||
8115919aa9 | |||
20e7c4e666 | |||
3b6941f5e9 | |||
ea2015c1f1 | |||
0abf63917b | |||
865604126e | |||
df8557ddf6 | |||
e2763c3caf | |||
b6e7772471 | |||
472fef1823 | |||
9ab8e66a0e | |||
145777deae | |||
ef29b23609 | |||
8c9b242562 | |||
909bfb61ba | |||
0e50bc2618 | |||
3d51494c68 | |||
368f893fe2 | |||
b67809803b | |||
3902ccc818 | |||
4ba1b2a048 | |||
82cec59118 | |||
1bbbf68e0f | |||
c0e0615336 | |||
8a97b2fba4 | |||
7cde30eaa0 | |||
be26a34d0a | |||
6b607899f0 | |||
389b2b072b | |||
68cad8ab17 | |||
a845f22988 | |||
c1086c5020 | |||
c74b1c585e | |||
e51951d1dc | |||
832fb6f0da | |||
3dfe710afa | |||
46b38d2e57 | |||
eea6de609b | |||
e60a74e2a7 | |||
69a72367b8 | |||
71cd12f6a8 | |||
154e83459d | |||
cea5c57ef0 | |||
115709f379 | |||
97df303218 | |||
04ba9f0c79 | |||
2b672eece1 | |||
ac9650d7cc | |||
7cc2622fbe | |||
46798fbf65 | |||
8df754b720 | |||
15b1bc8c93 | |||
c39af6ccc0 | |||
125ba9f211 | |||
73ff610c09 | |||
a27850e32d | |||
cd37a544b8 | |||
5d02e6572d | |||
c48d6b6076 | |||
f0dfb1c0c4 | |||
d82a2da7ac | |||
0ef5f3d8b5 | |||
a12f0395d0 | |||
20c7413375 | |||
acb04ed675 |
1025 changed files with 10892 additions and 397 deletions
|
@ -1 +0,0 @@
|
|||
2.5.1
|
23
README.md
Normal file
23
README.md
Normal file
|
@ -0,0 +1,23 @@
|
|||
wezm.net
|
||||
========
|
||||
|
||||
My website. Corrections for typos and other minor errors welcome via issue or
|
||||
pull request.
|
||||
|
||||
v2
|
||||
--
|
||||
|
||||
This is the current version of the website, built with [Zola].
|
||||
|
||||
v1
|
||||
--
|
||||
|
||||
This is the original version of the website containing posts from 2008–2019. It
|
||||
is built with [Nanoc].
|
||||
|
||||
---
|
||||
|
||||
Copyright © 2003 – 2022 Wesley Moore. All rights reserved
|
||||
|
||||
[Nanoc]: https://nanoc.ws/
|
||||
[Zola]: https://www.getzola.org/
|
12
README.mkdn
12
README.mkdn
|
@ -1,12 +0,0 @@
|
|||
WezM.net
|
||||
========
|
||||
|
||||
Site Structure
|
||||
--------------
|
||||
|
||||
/articles
|
||||
/technical
|
||||
/category
|
||||
/personal
|
||||
/category
|
||||
/about
|
|
@ -1,248 +0,0 @@
|
|||
This week I attended linux.conf.au (for the first time) in Christchurch, New
|
||||
Zealand. It's a week long conference covering Linux, open open source software
|
||||
and hardware, privacy, security and much more. The theme this year was [IoT].
|
||||
In line with the theme I built a digital conference badge to take to the
|
||||
conference. It used a tri-colour e-Paper display and was powered by a Rust
|
||||
program I built running on Raspbian Linux. This post describes how it was
|
||||
built, how it works, and how it fared at the conference.
|
||||
|
||||
### Building
|
||||
|
||||
After booking my tickets in October I decided I wanted to build a digital
|
||||
conference badge. I'm not entirely sure what prompted me to do this but it was
|
||||
a combination of seeing projects like the [BADGEr] in past, the theme of
|
||||
linux.conf.au 2019 being IoT, and an excuse to write more Rust. Since it was
|
||||
ostensibly a Linux conference it also seemed appropriate for it to run Linux.
|
||||
|
||||
Over the next few weeks I collected the parts and adaptors to build the badge. The main components were:
|
||||
|
||||
* [Raspberry Pi Zero W] - AU$15.00
|
||||
* [Pimoroni Inky pHAT] e-Paper display - AU$38.00
|
||||
|
||||
The Raspberry Pi Zero W is a single core 1Ghz ARM SoC with 512Mb RAM, Wi-FI,
|
||||
Bluetooth, microSD card slot, and mini HDMI. The Inky pHAT is a 212x104 pixel
|
||||
tri-colour (red, black, white) e-Paper display. It takes about 15 seconds to
|
||||
refresh the display but it draws very little power in between updates and the
|
||||
image persists even when power is removed.
|
||||
|
||||
I powered the badge with a several year old 4800mAh USB battery pack that I
|
||||
already owned. Some rough calculations suggested that it should run for many
|
||||
hours on this battery but I didn't actually test this until day 1 of the
|
||||
conference.
|
||||
|
||||
### Support Crates
|
||||
|
||||
The first part of the project involved building a Rust driver for the
|
||||
controller in the e-Paper display. That involved determining what controller
|
||||
the display used, as Pimoroni did not document the display they used for the
|
||||
Inky pHAT. Searching online for some of the comments in the Python driver
|
||||
suggested the display was possibly a HINK-E0213A07 - Electronic Paper display
|
||||
from Holitech Co. Further searching based on [the datasheet for that
|
||||
display][HINK-E0213A07] suggested that the controller was a [Solomon Systech
|
||||
SSD1675][SSD1675]. Cross referencing the display datasheet, [SSD1675
|
||||
datasheet], and the [Python source of Pimoroni's Inky pHAT
|
||||
driver][https://github.com/pimoroni/inky] suggested I was on the right track.
|
||||
|
||||
I set about building the Rust driver for the SSD1675 using the [embedded HAL
|
||||
traits]. These traits allow embedded Rust drivers to be built against a
|
||||
defacto-standard set of traits that allow the driver to be used in any
|
||||
environment that implements the traits. For example I make use of traits for
|
||||
[SPI] devices, and [GPIO] pins, which are implemented for
|
||||
[Linux][embedded-linx], as well as say, [STM32 dev boards]. This allows the
|
||||
driver to be written once and be potentially usable on may different devices.
|
||||
|
||||
The result was the [ssd1675 crate]. It's a so called no-std crate. That means
|
||||
it does not use the Rust standard library, instead sticking only to the core
|
||||
library. This allows the crate to be used in devices and microcontrollers
|
||||
without features like file systems, or heap allocators. The crate also makes
|
||||
use of the [embedded-graphics crate][embedded-graphics], which makes it easy to
|
||||
draw text and basic shapes on the display in a memory efficient manner.
|
||||
|
||||
Whilst testing the ssd1675 crate I also built another crate, [profont], which
|
||||
provides 7 sizes of the [ProFont font] for embedded graphics. The profont crate
|
||||
was published 24 Nov 2018, and ssd1675 was published a month later on 26 Dec
|
||||
2018.
|
||||
|
||||
### The Badge Itself
|
||||
|
||||
Now that I had all the prerequisites in place I could start working on the
|
||||
badge proper. I had a few goals for the badge and its implementation:
|
||||
|
||||
* I wanted the badge to have some interactive component.
|
||||
* I wanted there to be some sort of Internet aspect to tie in with the IoT
|
||||
theme of the conference.
|
||||
* I wanted the badge to be entirely powered by a single, efficient Rust binary,
|
||||
that did not shell out to other commands, or anything like that.
|
||||
* Ideally it would be relatively power efficient.
|
||||
|
||||
<figure>
|
||||
<img src="/images/2019/badge-early-revision_thumb.jpg" width="600" alt="Photo of e-Paper display showing my name, websize, IP address and uname information." />
|
||||
<figcaption>An early revision of the badge from 6 Jan 2019</figcaption>
|
||||
</figure>
|
||||
|
||||
I settled on having the badge program serve up a web page with some information
|
||||
about the project, myself, and some live stats of the Raspberry Pi (uptime,
|
||||
free RAM, etc.). The plain text version of the page looked like this:
|
||||
|
||||
[Insert sample response hre]
|
||||
|
||||
The interactive part came in the form of a virtual 'hi' counter. Each HTTP POST
|
||||
to the `/hi` endpoint incremented the count, which was shown on the badge. The
|
||||
badge showed a URL to access in order to view the page, the URL was just the
|
||||
badge's IP address on the conference Wi-Fi. To provide a little protection
|
||||
against abuse I added code that only allowed a give IP to increment the count
|
||||
once per hour.
|
||||
|
||||
When building the badge software these are some of the details and goals I implemented:
|
||||
|
||||
* Wi-Fi going away
|
||||
* IP address changing
|
||||
* Memory use of large POSTs (don
|
||||
* Prevent duplicate submissions
|
||||
* Pluralisation of text on the badge and on the web page
|
||||
* Automatically shift the text as the count requires more digits
|
||||
* If the web page is requested with an `Accept` header that doesn't include
|
||||
`text/html` (E.g. `curl`) then the response is plain text and the method to
|
||||
"say hello" is a curl command. If the user agent indicates they accept HTML
|
||||
then the page is HTML and conttains a form with a button to, "say hello".
|
||||
* Avoid aborting on errors:
|
||||
* I kind of ran out of time to handle all errors well, but most are handled
|
||||
gracefully and won't abort the program. In some cases a default is used in
|
||||
the face of an eror. In other cases I just resorted to logging a mesasge and
|
||||
carrying on.
|
||||
* Keep memory usage low:
|
||||
* The web server efficiently discards any large POST requests sent to it, to
|
||||
avoid exhausing RAM. Typical RAM stats showed around 420Mb free of the
|
||||
512Mb most of the time, of which some is taken for the GPU. The Rust
|
||||
program itself using about 4Mb.
|
||||
* Be relatively power efficient
|
||||
* Use Rust instead of a scripting language
|
||||
* Only update the display when something it's showing changes
|
||||
* Only check for changes every 15 seconds (the rest of the time that tread just slept)
|
||||
* Put the display into deep sleep after updating
|
||||
|
||||
I used [hyper] for the HTTP server. To get a feel for the limits of the device
|
||||
I did some rudimentary HTTP benchmarking with [wrk] and concluded that 300 requests
|
||||
per second was was probably going to be fine. ;)
|
||||
|
||||
Running 10s test @ http://10.0.0.18:8080/
|
||||
4 threads and 100 connections
|
||||
Thread Stats Avg Stdev Max +/- Stdev
|
||||
Latency 316.58ms 54.41ms 1.28s 92.04%
|
||||
Req/Sec 79.43 43.24 212.00 67.74%
|
||||
3099 requests in 10.04s, 3.77MB read
|
||||
Requests/sec: 308.61
|
||||
Transfer/sec: 384.56KB
|
||||
|
||||
### Mounting
|
||||
|
||||
When I started the project I imagined it would hang it around my neck like
|
||||
conference lanyard. When departure day arrived I still hadn't worked out how
|
||||
this would work in practice (power delivery being a major concern). In the end
|
||||
I settled on attaching it to the strap on my backpack. My bag has lots of
|
||||
webbing so there were plenty of loops to hold it in place. I was also able to
|
||||
use the velcro covered holes intended for water tubes to get the cable neatly
|
||||
into the bag.
|
||||
|
||||
## At the Conference
|
||||
|
||||
I had everything pretty much working for the start of the conference, although
|
||||
I did make some final improvements and add a systemd unit to automatically start
|
||||
and restart the Rust binary once I arrived in my accommodation on the Sunday
|
||||
before the conference. At this point there were still two unknowns: battery
|
||||
life and how the Raspberry Pi would handle coming in and out of Wi-Fi range.
|
||||
The Wi-Fi turned out fine: automatically reconnecting whenever it came into
|
||||
range of the Wi-Fi.
|
||||
|
||||
<figure>
|
||||
<img src="/images/2019/badge-sunday-night_thumb.jpg" width="600" alt="Badge display a count of zero." />
|
||||
<figcaption>Ready for day 1</figcaption>
|
||||
</figure>
|
||||
|
||||
### Reception
|
||||
|
||||
At this point I had not had time to test battery life, so day one I hooked it
|
||||
up and hoped for the best. Day 1 was a success! I had my first few people talk
|
||||
to me about the badge and increment the counter. Battery life was good too.
|
||||
After 12 hours of uptime the battery was still showing it was half full. Later
|
||||
in the week I left the badge running overnight to hit 24 hours uptime. The
|
||||
battery level indicator was on the last light so I suspect there wasn't much
|
||||
juice left.
|
||||
|
||||
<figure>
|
||||
<img src="/images/2019/badge-first-hello_thumb.jpg" width="600" alt="Badge display showing a hello count of 1." />
|
||||
<figcaption>Me after receiving my first hello on the badge</figcaption>
|
||||
</figure>
|
||||
|
||||
On day 2 I had had several people suggest that I needed a QR code for the URL.
|
||||
Turns out entering an IP address on a phone keyboard is tedious. So after talks
|
||||
that evening I added a QR code to the display. It's dynamically generated and
|
||||
contains the same URL that is shown on the display. There were several good crates
|
||||
to choose from. Ultimately I picked one that didn't have any image
|
||||
dependencies, which allowed my to convert the data into embedded-graphics
|
||||
pixels. The change was a success, most people scanned the QR code from this
|
||||
point on.
|
||||
|
||||
<figure>
|
||||
<img src="/images/2019/badge-with-qr-code_thumb.jpg" width="600" alt="Badge display now including QR code." />
|
||||
<figcaption>Badge display showing the newly added QR code</figcaption>
|
||||
</figure>
|
||||
|
||||
On day 2 I also ran into [E. Dunham][edunham], and rambled briefly about my
|
||||
badge project and that it was built with Rust. To my absolute delight [the
|
||||
project was featured in their talk the next day][edunham-talk]. The project was
|
||||
mentioned and linked on slide and I was asked to raise my hand in case anyone
|
||||
wanted to chat afterwards.
|
||||
|
||||
<figure>
|
||||
<img src="/images/2019/badge-edunham-talk_thumb.jpg" width="600" alt="Photo of E. Dunham's slide with a link to my git repo." />
|
||||
<figcaption>Photo of E. Dunham's slide with a link to my git repo</figcaption>
|
||||
</figure>
|
||||
|
||||
At the end of the talk the audience was asked to talk about a Rust project they
|
||||
were working on. Each person to do so got a little plush Ferris. I spoke about
|
||||
[Read Rust] and am now the proud owner of a litle Ferris.
|
||||
|
||||
[Insert Ferris here]
|
||||
|
||||
### CHANGEME What did I learn?
|
||||
|
||||
By the end of the conference the badge showed a count of 12. It had worked
|
||||
flawlessly over the five days.
|
||||
|
||||
Small projects with a fairly hard deadline are a good way to ensure it's seen
|
||||
through to completion. Also a great motivator to publish some open source code.
|
||||
|
||||
I think I greatly overestimated the number of people that would interact with
|
||||
the badge. Of those that did I think most tapped the button to increase the
|
||||
counter and didn't read much else on the page. For example no one commented on
|
||||
the system stats at the bottom of the page. I had imagined the badge as a sort
|
||||
of digital business card but this did not really eventuate in practice.
|
||||
|
||||
Attaching the Pi and display to my bag worked out pretty well although I did
|
||||
have to be careful when putting my bag on and it was easy to catch on my
|
||||
clothes. Also one day it started raining on the way back to the accommodation.
|
||||
I had not factored that in at all and given it wasn't super easy to take on and
|
||||
off I ended up shielding it with my hand all the way back.
|
||||
|
||||
TODO: Link to code
|
||||
TODO: Add images
|
||||
|
||||
### Would I do it again?
|
||||
|
||||
If I were to do it again I might do something less interactive and perhaps more
|
||||
informational but updated more regularly. For example showing the previous and
|
||||
next talks to attend. Perhaps even allowing free text.
|
||||
|
||||
|
||||
Maybe. I think if I were to do something along these lines again I might try to tie into a talk submission.
|
||||
For example I could have submitted a talk about using the embedded Rust ecosystem on a Rasperry Pi and made
|
||||
reference to the badge in the talk or used it for examples. I think this would give more info about the project
|
||||
to a bunch of people at once and also potentially teach them something at the same time.
|
||||
|
||||
[BADGEr]: https://wyolum.com/projects/badger/
|
||||
[HINK-E0213A07]: https://www.unisystem-displays.com/en/fileuploader/download/download/?d=0&file=custom%2Fupload%2Ffile%2F6f3084488018ca68c5bf0a26460e7c57%2FHINK-E0213A07-V1.1-Spec.pdf
|
||||
[SSD1675]: http://www.solomon-systech.com/en/product/advanced-display/bistable-display-driver-ic/SSD1675/
|
||||
[SSD1675 datasheet]: https://www.buydisplay.com/download/ic/SSD1675A.pdf
|
||||
[edunham-talk]: https://youtu.be/uCnnhMleoKA?t=530
|
||||
[edunham]: http://edunham.net/
|
|
@ -1,13 +0,0 @@
|
|||
---
|
||||
title: Rust powered linux.conf.au e-Paper badge
|
||||
extra: TODO
|
||||
kind: article
|
||||
section: technical
|
||||
created_at: 2019-01-26 16:17:00.000000000 +10:00
|
||||
keywords:
|
||||
- rust
|
||||
- linux
|
||||
- linux.conf.au
|
||||
- epaper
|
||||
- display
|
||||
short_url:
|
|
@ -1,4 +0,0 @@
|
|||
<div id="content">
|
||||
<h1><a href="<%= @item.reps[:default].path %>"><%=h @item[:title] %></a></h1>
|
||||
<%= yield %>
|
||||
</div>
|
1
.gitignore → v1/.gitignore
vendored
1
.gitignore → v1/.gitignore
vendored
|
@ -3,6 +3,7 @@ output/fonts/*
|
|||
output/about/
|
||||
output/articles/
|
||||
output/css/screen.css
|
||||
output/css/rouge.css
|
||||
output/feed/
|
||||
output/index.html
|
||||
output/personal/
|
1
v1/.ruby-version
Normal file
1
v1/.ruby-version
Normal file
|
@ -0,0 +1 @@
|
|||
2.7.5
|
38
v1/Dockerfile
Normal file
38
v1/Dockerfile
Normal file
|
@ -0,0 +1,38 @@
|
|||
FROM alpine:3.9 AS build
|
||||
|
||||
ARG WEZMUID=2000
|
||||
ARG WEZMGID=2000
|
||||
ARG USER=wezm
|
||||
|
||||
RUN apk --update add --no-cache ruby-dev ruby-bundler ruby-bigdecimal ruby-json build-base zlib-dev \
|
||||
&& addgroup -g ${WEZMGID} ${USER} \
|
||||
&& adduser -D -u ${WEZMUID} -G ${USER} -h /home/${USER} -D ${USER}
|
||||
|
||||
RUN mkdir /usr/share/www && chown wezm:wezm /usr/share/www
|
||||
|
||||
WORKDIR /usr/share/www
|
||||
|
||||
USER wezm
|
||||
|
||||
COPY --chown=wezm:wezm Gemfile .
|
||||
COPY --chown=wezm:wezm Gemfile.lock .
|
||||
|
||||
RUN bundle install -j 4 --deployment --without 'test development'
|
||||
|
||||
COPY --chown=wezm:wezm . .
|
||||
|
||||
RUN bundle exec nanoc co
|
||||
|
||||
|
||||
FROM 791569612186.dkr.ecr.ap-southeast-2.amazonaws.com/nginx
|
||||
|
||||
ARG WEZMUID=2000
|
||||
ARG WEZMGID=2000
|
||||
ARG USER=wezm
|
||||
|
||||
RUN addgroup -g ${WEZMGID} ${USER} \
|
||||
&& adduser -D -u ${WEZMUID} -G ${USER} -h /home/${USER} -D ${USER}
|
||||
|
||||
COPY --from=build --chown=wezm:wezm /usr/share/www/output /usr/share/www
|
||||
|
||||
EXPOSE 80
|
|
@ -15,10 +15,12 @@ gem 'builder'
|
|||
gem 'fssm'
|
||||
gem 'systemu'
|
||||
gem 'listen'
|
||||
gem 'guard-nanoc'
|
||||
gem 'adsf'
|
||||
gem 'rouge'
|
||||
|
||||
if RbConfig::CONFIG['target_os'] =~ /(?i-mx:bsd|dragonfly)/
|
||||
gem 'rb-kqueue', '>= 0.2'
|
||||
group :development do
|
||||
gem 'guard-nanoc'
|
||||
if RbConfig::CONFIG['target_os'] =~ /(?i-mx:bsd|dragonfly)/
|
||||
gem 'rb-kqueue', '>= 0.2'
|
||||
end
|
||||
end
|
|
@ -1,31 +1,31 @@
|
|||
GEM
|
||||
remote: https://rubygems.org/
|
||||
specs:
|
||||
addressable (2.5.2)
|
||||
addressable (2.6.0)
|
||||
public_suffix (>= 2.0.2, < 4.0)
|
||||
adsf (1.4.0)
|
||||
adsf (1.4.1)
|
||||
rack (>= 1.0.0, < 3.0.0)
|
||||
bitly (1.1.0)
|
||||
bitly (1.1.2)
|
||||
httparty (>= 0.7.6)
|
||||
multi_json (~> 1.3)
|
||||
oauth2 (>= 0.5.0, < 2.0)
|
||||
builder (3.2.3)
|
||||
coderay (1.1.2)
|
||||
colored (1.2)
|
||||
concurrent-ruby (1.0.5)
|
||||
cri (2.13.0)
|
||||
concurrent-ruby (1.1.4)
|
||||
cri (2.15.3)
|
||||
colored (~> 1.2)
|
||||
ddmemoize (1.0.0)
|
||||
ddmetrics (~> 1.0)
|
||||
ref (~> 2.0)
|
||||
ddmetrics (1.0.1)
|
||||
ddplugin (1.0.2)
|
||||
faraday (0.12.2)
|
||||
faraday (0.15.4)
|
||||
multipart-post (>= 1.2, < 3)
|
||||
ffi (1.9.25)
|
||||
ffi (1.10.0)
|
||||
formatador (0.2.5)
|
||||
fssm (0.2.10)
|
||||
guard (2.14.2)
|
||||
guard (2.15.0)
|
||||
formatador (>= 0.2.4)
|
||||
listen (>= 2.7, < 4.0)
|
||||
lumberjack (>= 1.0.12, < 2.0)
|
||||
|
@ -35,72 +35,73 @@ GEM
|
|||
shellany (~> 0.0)
|
||||
thor (>= 0.18.1)
|
||||
guard-compat (1.2.1)
|
||||
guard-nanoc (2.1.3)
|
||||
guard-nanoc (2.1.4)
|
||||
guard (~> 2.8)
|
||||
guard-compat (~> 1.0)
|
||||
nanoc (>= 4.3.8, < 5.0)
|
||||
haml (5.0.3)
|
||||
haml (5.0.4)
|
||||
temple (>= 0.8.0)
|
||||
tilt
|
||||
hamster (3.0.0)
|
||||
concurrent-ruby (~> 1.0)
|
||||
httparty (0.15.6)
|
||||
httparty (0.16.3)
|
||||
mime-types (~> 3.0)
|
||||
multi_xml (>= 0.5.2)
|
||||
jwt (1.5.6)
|
||||
json_schema (0.20.1)
|
||||
jwt (2.1.0)
|
||||
listen (3.1.5)
|
||||
rb-fsevent (~> 0.9, >= 0.9.4)
|
||||
rb-inotify (~> 0.9, >= 0.9.7)
|
||||
ruby_dep (~> 1.2)
|
||||
lumberjack (1.0.13)
|
||||
method_source (0.9.0)
|
||||
mime-types (3.1)
|
||||
method_source (0.9.2)
|
||||
mime-types (3.2.2)
|
||||
mime-types-data (~> 3.2015)
|
||||
mime-types-data (3.2016.0521)
|
||||
mini_portile2 (2.3.0)
|
||||
multi_json (1.12.2)
|
||||
mime-types-data (3.2018.0812)
|
||||
mini_portile2 (2.4.0)
|
||||
multi_json (1.13.1)
|
||||
multi_xml (0.6.0)
|
||||
multipart-post (2.0.0)
|
||||
nanoc (4.9.3)
|
||||
nanoc (4.11.0)
|
||||
addressable (~> 2.5)
|
||||
cri (~> 2.8)
|
||||
cri (~> 2.15)
|
||||
ddmemoize (~> 1.0)
|
||||
ddmetrics (~> 1.0)
|
||||
ddplugin (~> 1.0)
|
||||
hamster (~> 3.0)
|
||||
json_schema (~> 0.19)
|
||||
parallel (~> 1.12)
|
||||
ref (~> 2.0)
|
||||
slow_enumerator_tools (~> 1.0)
|
||||
tomlrb (~> 1.2)
|
||||
nenv (0.3.0)
|
||||
nokogiri (1.8.1)
|
||||
mini_portile2 (~> 2.3.0)
|
||||
nokogiri (1.10.1)
|
||||
mini_portile2 (~> 2.4.0)
|
||||
notiffany (0.1.1)
|
||||
nenv (~> 0.1)
|
||||
shellany (~> 0.0)
|
||||
oauth2 (1.4.0)
|
||||
faraday (>= 0.8, < 0.13)
|
||||
jwt (~> 1.0)
|
||||
oauth2 (1.4.1)
|
||||
faraday (>= 0.8, < 0.16.0)
|
||||
jwt (>= 1.0, < 3.0)
|
||||
multi_json (~> 1.3)
|
||||
multi_xml (~> 0.5)
|
||||
rack (>= 1.2, < 3)
|
||||
parallel (1.12.1)
|
||||
pry (0.11.3)
|
||||
parallel (1.13.0)
|
||||
pry (0.12.2)
|
||||
coderay (~> 1.1.0)
|
||||
method_source (~> 0.9.0)
|
||||
public_suffix (3.0.3)
|
||||
rack (2.0.3)
|
||||
rake (12.1.0)
|
||||
rack (2.0.6)
|
||||
rake (12.3.2)
|
||||
rb-fsevent (0.10.3)
|
||||
rb-inotify (0.9.10)
|
||||
ffi (>= 0.5.0, < 2)
|
||||
rb-kqueue (0.2.5)
|
||||
ffi (>= 0.5.0)
|
||||
rb-inotify (0.10.0)
|
||||
ffi (~> 1.0)
|
||||
rdiscount (2.2.0.1)
|
||||
ref (2.0.0)
|
||||
rouge (3.2.1)
|
||||
rouge (3.3.0)
|
||||
ruby_dep (1.5.0)
|
||||
rubypants (0.6.0)
|
||||
sass (3.5.1)
|
||||
rubypants (0.7.0)
|
||||
sass (3.7.3)
|
||||
sass-listen (~> 4.0.0)
|
||||
sass-listen (4.0.0)
|
||||
rb-fsevent (~> 0.9, >= 0.9.4)
|
||||
|
@ -109,9 +110,9 @@ GEM
|
|||
slow_enumerator_tools (1.1.0)
|
||||
systemu (2.6.5)
|
||||
temple (0.8.0)
|
||||
thor (0.20.0)
|
||||
tilt (2.0.8)
|
||||
tomlrb (1.2.7)
|
||||
thor (0.20.3)
|
||||
tilt (2.0.9)
|
||||
tomlrb (1.2.8)
|
||||
|
||||
PLATFORMS
|
||||
ruby
|
||||
|
@ -128,7 +129,6 @@ DEPENDENCIES
|
|||
nanoc (~> 4.0)
|
||||
nokogiri
|
||||
rake
|
||||
rb-kqueue (>= 0.2)
|
||||
rdiscount
|
||||
rouge
|
||||
rubypants
|
||||
|
@ -136,4 +136,4 @@ DEPENDENCIES
|
|||
systemu
|
||||
|
||||
BUNDLED WITH
|
||||
1.16.3
|
||||
1.17.2
|
36
v1/README.mkdn
Normal file
36
v1/README.mkdn
Normal file
|
@ -0,0 +1,36 @@
|
|||
WezM.net
|
||||
========
|
||||
|
||||
Site Structure
|
||||
--------------
|
||||
|
||||
/articles
|
||||
/technical
|
||||
/category
|
||||
/personal
|
||||
/category
|
||||
/about
|
||||
|
||||
Tips
|
||||
----
|
||||
|
||||
Set updated_at on a post in vim:
|
||||
|
||||
:r! ruby -rtime -e "puts File.mtime('%:r.md').xmlschema"
|
||||
|
||||
Trim CLI screenshots:
|
||||
|
||||
convert *.png -set filename:name '%t' -background white -splice 0x1 -background white -splice 0x1 -trim +repage -chop 0x1 '%[filename:name].png'
|
||||
|
||||
Setup
|
||||
-----
|
||||
|
||||
frum install (then cd ..; cd -)
|
||||
gem install bundler --no-doc --version '~> 1'
|
||||
bundle install
|
||||
|
||||
Building and Deployment
|
||||
-----------------------
|
||||
|
||||
* Build with: `nanoc co`
|
||||
* Deploy with: `nanoc deploy`
|
|
@ -43,11 +43,11 @@ data_sources:
|
|||
# same as the items root, but applies to layouts rather than items.
|
||||
layouts_root: /
|
||||
|
||||
base_url: 'http://www.wezm.net'
|
||||
base_url: 'https://www.wezm.net'
|
||||
deploy:
|
||||
default:
|
||||
kind: rsync
|
||||
dst: "eforce.binarytrance.com:/usr/local/www/www.wezm.net"
|
||||
dst: "hardforze.binarytrance.com:infrastructure/volumes/www/wezm.net"
|
||||
#options: [ '-rlpgoDvz', '--delete', '--exclude=".svn"' ]
|
||||
options: [ '-avz', '--omit-dir-times', '--delete', '--exclude=".svn"' ]
|
||||
options: [ '-avz' ]
|
||||
|
|
@ -18,13 +18,12 @@ Find me on the Internet in one of these places:
|
|||
|
||||
<ul>
|
||||
<li>Email – <a href="mailto:wes@wezm.net">wes@wezm.net</a></li>
|
||||
<li><a href="https://binarytrance.com/">Binary Trance Software</a> – My app development company</li>
|
||||
<li><a href="http://bitcannon.net/">Bit Cannon</a> – My other blog</li>
|
||||
<li><a href="http://readrust.net/">Read Rust</a> –
|
||||
Aggregator of content related to the <a href="https://www.rust-lang.org/">Rust</a> programming language</li>
|
||||
<li><a href="http://readrust.net/">Read Rust</a> –
|
||||
Aggregator of content related to the <a href="https://www.rust-lang.org/">Rust</a> programming language</li>
|
||||
<li><a href="http://www.flickr.com/photos/wezm/">Flickr</a></li>
|
||||
<li><a href="https://github.com/wezm">GitHub</a></li>
|
||||
<li><a href="https://mastodon.social/@wezm">Mastodon</a></li>
|
||||
<li><a href="https://mastodon.decentralised.social/@wezm">Mastodon/Fediverse</a></li>
|
||||
<li><a href="https://patreon.com/wezm">Patreon</a></li>
|
||||
<li><a href="http://stackoverflow.com/users/38820/wes">Stack Overflow</a></li>
|
||||
<li><a href="https://twitter.com/wezm">Twitter</a></li>
|
|
@ -6,26 +6,26 @@ A friend asked the following today, the reply was big enough I decided to post i
|
|||
>
|
||||
> Has it changed your life? Has the battery life been crappy for you? Talk time OK?
|
||||
|
||||
Its definitely the best phone I've had. Part of that is due to the tight integration with Mac OS X, which obviously very few companies were going to pull off. As a device its brilliant to use and full of functionality. I'm loving the apps and decent browser. The WiFi is really nice at home. The iPod part obviously works as well and better than any prior iPod.
|
||||
Its definitely the best phone I've had. Part of that is due to the tight integration with Mac OS X, which obviously very few companies were going to pull off. As a device it's brilliant to use and full of functionality. I'm loving the apps and decent browser. The WiFi is really nice at home. The iPod part obviously works as well and better than any prior iPod.
|
||||
|
||||
The on screen keyboard is pretty much as described. You have to give it time to get the hang of it and you have to trust it. If you're typing a word that would be in the English dictionary you're best to keep on typing even if the word is way off. By the time you get to pressing space its usually selected the right word, which is selected automatically upon space. Two irritations with typing though. Its less likely to get shorter word right, particularly when there's multiple valid options. There's no way that I'm aware of to get a list of possibilities and choose the one you want. Of course being a small word means its not hard to fix and if you type it correctly in the first place then it isn't a problem at all. The other minor annoyance is when you get to the last word in a sentence that is mis-typed with a correct suggestion it appears the only way to accept it is to press space (and then delete the space) or grab a full stop.
|
||||
The on screen keyboard is pretty much as described. You have to give it time to get the hang of it and you have to trust it. If you're typing a word that would be in the English dictionary you're best to keep on typing even if the word is way off. By the time you get to pressing space it's usually selected the right word, which is selected automatically upon space. Two irritations with typing though. Its less likely to get shorter word right, particularly when there's multiple valid options. There's no way that I'm aware of to get a list of possibilities and choose the one you want. Of course being a small word means it's not hard to fix and if you type it correctly in the first place then it isn't a problem at all. The other minor annoyance is when you get to the last word in a sentence that is mis-typed with a correct suggestion it appears the only way to accept it is to press space (and then delete the space) or grab a full stop.
|
||||
<!--more-->
|
||||
|
||||
<a href="/images/2008/07/img_0012.png" class="alignright"><img src="/images/2008/07/img_0012-200x300.png" alt="Byline" title="img_0012" width="200" height="300" class="alignnone size-medium wp-image-48" /></a>I haven't missed MMS at all, especially with a decent email client built in that can talk to Gmail via IMAP and send photos to flickr that way.
|
||||
<a href="/images/2008/07/img_0012.png" class="alignright"><img src="/images/2008/07/img_0012-200x300.png" alt="Byline" title="img_0012" width="200" height="300" class="alignnone size-medium wp-image-48" /></a>I haven't missed MMS at all, especially with a decent email client built in that can talk to Gmail via IMAP and send photos to Flickr that way.
|
||||
|
||||
I have missed Todo functionality. I have no idea why Apple have not got this syncing. The support is there in iSync and todos sync with my old phone (Nokia 6280) just fine. I'm hoping that its one of these things that will make it eventually. There's two reasons I miss todo, one to track things to be done, the other is for reminders for things that don't have a duration (which can be put in as calendar entries). There is no way to do reminders without a duration at the moment. Having said that the calendar functionality is comprehensive. It supports multiple calendars, full editing, meeting acceptance and basically anything you can do on the desktop.
|
||||
I have missed Todo functionality. I have no idea why Apple have not got this syncing. The support is there in iSync and todos sync with my old phone (Nokia 6280) just fine. I'm hoping that it's one of these things that will make it eventually. There's two reasons I miss todo, one to track things to be done, the other is for reminders for things that don't have a duration (which can be put in as calendar entries). There is no way to do reminders without a duration at the moment. Having said that the calendar functionality is comprehensive. It supports multiple calendars, full editing, meeting acceptance and basically anything you can do on the desktop.
|
||||
|
||||
<a href="/images/2008/07/img_0019.png" class="alignleft clear"><img src="/images/2008/07/img_0019-200x300.png" alt="Twinkle" title="img_0019" width="200" height="300" class="alignnone size-medium wp-image-55" /></a>Another annoyance surrounds SMS. When on silent you only get a single vibration on new message, which is easily missed. My old phone did three, which was better. Also when you get an SMS my old phone would show an envelope on the black and white standby screen. With the iPhone you have to wake it up to see if you've got a message after the display goes back off.
|
||||
|
||||
The AppStore is great, some of the apps are very well done. I'm really liking <a href="http://phobos.apple.com/WebObjects/MZStore.woa/wa/viewSoftware?id=284946773&mt=8">Byline</a>, <a href="http://phobos.apple.com/WebObjects/MZStore.woa/wa/viewSoftware?id=284967867&mt=8">Twinkle</a>, <a href="http://phobos.apple.com/WebObjects/MZStore.woa/wa/viewSoftware?id=284919489&mt=8">Exposure</a> and <a href="http://phobos.apple.com/WebObjects/MZStore.woa/wa/viewSoftware?id=284825922&mt=8">MoPhoTo</a>. I'm not much of a Facebook user but the <a href="http://phobos.apple.com/WebObjects/MZStore.woa/wa/viewSoftware?id=284882215&mt=8">Facebook app</a> is very well done. It just the core parts of Facebook without all the crap. Of those five, three are free, one is free by ad-supported (with a pay for version available) and the other AU$12.99. I think that's a pretty good spread for some top quality apps. Some screenshots of these apps are scattered below.
|
||||
The AppStore is great, some of the apps are very well done. I'm really liking <a href="http://phobos.apple.com/WebObjects/MZStore.woa/wa/viewSoftware?id=284946773&mt=8">Byline</a>, <a href="http://phobos.apple.com/WebObjects/MZStore.woa/wa/viewSoftware?id=284967867&mt=8">Twinkle</a>, <a href="http://phobos.apple.com/WebObjects/MZStore.woa/wa/viewSoftware?id=284919489&mt=8">Exposure</a> and <a href="http://phobos.apple.com/WebObjects/MZStore.woa/wa/viewSoftware?id=284825922&mt=8">MoPhoTo</a>. I'm not much of a Facebook user but the <a href="http://phobos.apple.com/WebObjects/MZStore.woa/wa/viewSoftware?id=284882215&mt=8">Facebook app</a> is very well done. It's just the core parts of Facebook without all the crap. Of those five, three are free, one is free by ad-supported (with a pay for version available) and the other AU$12.99. I think that's a pretty good spread for some top quality apps. Some screenshots of these apps are scattered below.
|
||||
|
||||
<a href="/images/2008/07/img_0016.png" class="alignright clear"><img src="/images/2008/07/img_0016-200x300.png" alt="Exposure" title="img_0016" width="200" height="300" class="alignnone size-medium wp-image-52" /></a>Battery life is nothing brilliant as has been reported elsewhere. You'd probably want to change it every day. Today I watched a video podcast on the way to work, send a couple of SMSs during the day, added a calendar event, got a call from Steve, called the dentist, listened to music, read in Google Reader via the Byline app, read and updated Twitter via the Twinkle app and used the timer to cook dinner and its showing half battery. It was off the changer all last night too.
|
||||
<a href="/images/2008/07/img_0016.png" class="alignright clear"><img src="/images/2008/07/img_0016-200x300.png" alt="Exposure" title="img_0016" width="200" height="300" class="alignnone size-medium wp-image-52" /></a>Battery life is nothing brilliant as has been reported elsewhere. You'd probably want to change it every day. Today I watched a video podcast on the way to work, send a couple of SMSs during the day, added a calendar event, got a call from Steve, called the dentist, listened to music, read in Google Reader via the Byline app, read and updated Twitter via the Twinkle app and used the timer to cook dinner and it's showing half battery. It was off the changer all last night too.
|
||||
|
||||
A complaint of the old one was that the ringer and message volume was very low and easily missed. I've it plenty loud enough and its only on about three quarters. Speaking on the phone the volume is good, although I haven't tried extreme environments like a club.
|
||||
A complaint of the old one was that the ringer and message volume was very low and easily missed. I've it plenty loud enough and it's only on about three quarters. Speaking on the phone the volume is good, although I haven't tried extreme environments like a club.
|
||||
|
||||
One of the best built-in apps on the whole phone is maps. Whenever you want to find something, or get the details for a business, get directions, just bring up Maps and it will sort it out. Its as good as, if not better than Google Maps on the desktop. It has the same three views too: Maps, Satellite and Hybrid. The location awareness is great and there's some basic uses of it in the apps so far, hopefully more creative uses come out. One interesting one is an app called Exposure that is a flickr client with a 'near me' function. It shows photos near your current location. Doing so at home brings ups photos of St Kilda Rd, the fountain in the gardens out the front (Pictured above).
|
||||
One of the best built-in apps on the whole phone is maps. Whenever you want to find something, or get the details for a business, get directions, just bring up Maps and it will sort it out. Its as good as, if not better than Google Maps on the desktop. It has the same three views too: Maps, Satellite and Hybrid. The location awareness is great and there's some basic uses of it in the apps so far, hopefully more creative uses come out. One interesting one is an app called Exposure that is a Flickr client with a 'near me' function. It shows photos near your current location. Doing so at home brings ups photos of St Kilda Rd, the fountain in the gardens out the front (Pictured above).
|
||||
|
||||
Maybe I'm easily sold on such things but the UI is truly beautiful and being solely finger driven is revolutionarily (on a phone). I'm a happy customer.
|
||||
Maybe I'm easily sold on such things but the UI is truly beautiful and being solely finger driven is revolutionary (on a phone). I'm a happy customer.
|
||||
|
||||
<a href="/images/2008/07/img_0017.png" class="alignleft clear"><img src="/images/2008/07/img_0017-200x300.png" alt="Facebook" title="img_0017" width="200" height="300" class="alignnone size-medium wp-image-53" /></a><a href="/images/2008/07/img_0018.png" class="alignright"><img src="/images/2008/07/img_0018-200x300.png" alt="MoPhoTo" title="img_0018" width="200" height="300" class="alignnone size-medium wp-image-54" /></a>
|
||||
<div style="clear: both;"> </div>
|
||||
<div style="clear: both;"> </div>
|
|
@ -1,50 +1,37 @@
|
|||
Binary Trance Software
|
||||
----------------------
|
||||
|
||||
Through my app development company [Binary Trance Software][bt] I've
|
||||
built the following apps:
|
||||
|
||||
* [SymbolMate][symbolmate] -- Quickly find and copy symbols and Emoji
|
||||
|
||||
[bt]: https://binarytrance.com/
|
||||
[symbolmate]: https://binarytrance.com/apps/symbolmate
|
||||
|
||||
Websites
|
||||
--------
|
||||
|
||||
A couple of other websites I maintain are:
|
||||
Other websites I maintain are:
|
||||
|
||||
* [Read Rust][readrust] -- an aggregator of news about the [Rust programming
|
||||
language][Rust].
|
||||
* [Bit Cannon][bitcannon] -- a new blog that I designed and built with
|
||||
[Hugo][hugo] as a bit of an experiment, the exact nature of which is still
|
||||
* [Desktop Institute][desktop-institute] -- Documenting the search for a
|
||||
desktop environment that combines the, "it just works", nature of [GNOME] with
|
||||
the window management of [Awesome].
|
||||
* [Bit Cannon][bitcannon] -- a blog that I designed and built with
|
||||
[Hugo] as a bit of an experiment, the exact nature of which is still
|
||||
evolving.
|
||||
* [Linked List][linkedlist] -- "a semi-organized collection of knowledge
|
||||
that I have accumulated.", created as a reference for myself but also published
|
||||
publically in the hope it may be useful to others as well. The code ([pkb])
|
||||
publicly in the hope it may be useful to others as well. The code ([pkb])
|
||||
is open source.
|
||||
|
||||
[Awesome]: https://awesomewm.org/
|
||||
[bitcannon]: https://bitcannon.net/
|
||||
[desktop-institute]: https://desktop.institute/
|
||||
[GNOME]: https://www.gnome.org/
|
||||
[Hugo]: https://gohugo.io/
|
||||
[readrust]: https://readrust.net/
|
||||
[Rust]: https://www.rust-lang.org/
|
||||
[bitcannon]: http://bitcannon.net/
|
||||
[hugo]: http://gohugo.io/
|
||||
|
||||
BSD CI
|
||||
------
|
||||
|
||||
[BSD CI] (currently in development) aims to provide a simple way for software
|
||||
projects to build and test on [BSD operating systems][run-bsd].
|
||||
|
||||
[BSD CI]: http://bsd-ci.com/
|
||||
[run-bsd]: http://runbsd.info/
|
||||
|
||||
Open Source Projects
|
||||
--------------------
|
||||
|
||||
I have a collection of open-source software on [GitHub][github]. Some of the
|
||||
I have a collection of open-source software on [GitHub] and [Sourcehut]. Some of the
|
||||
more noteworthy projects are listed below.
|
||||
|
||||
[github]: http://github.com/wezm
|
||||
[GitHub]: https://github.com/wezm
|
||||
[Sourcehut]: https://git.sr.ht/~wezm/
|
||||
|
||||
### Read Rust
|
||||
|
||||
|
@ -62,7 +49,7 @@ to quickly publish snippets of knowledge. It powers
|
|||
[linkedlist.org][linkedlist], which is my instance of pkb.
|
||||
|
||||
[pkb]: https://github.com/wezm/pkb
|
||||
[Rails]: http://rubyonrails.org/
|
||||
[Rails]: https://rubyonrails.org/
|
||||
[linkedlist]: https://linkedlist.org/
|
||||
|
||||
### titlecase
|
||||
|
@ -86,17 +73,6 @@ Compiler][ragel] in the hope that it will help ensure fast and correct parsing.
|
|||
[mustache]: http://mustache.github.com/
|
||||
[ragel]: http://www.complang.org/ragel/
|
||||
|
||||
### node-genx
|
||||
|
||||
[node-genx] is a [node.js][node] binding to the [Genx][genx] XML generation
|
||||
library. It allows fast and correct XML generation from the Javascript based
|
||||
node.js environment. Available for easy install via [npm].
|
||||
|
||||
[node-genx]: https://github.com/wezm/node-genx
|
||||
[node]: http://nodejs.org/
|
||||
[genx]: http://www.tbray.org/ongoing/When/200x/2004/02/20/GenxStatus
|
||||
[npm]: http://npmjs.org/
|
||||
|
||||
### Weather Station
|
||||
|
||||
I previously had a weather station at my home for keeping track of the local
|
||||
|
@ -118,3 +94,10 @@ See the following posts for more information on the weather station:
|
|||
|
||||
* [Weather Station Install](/personal/2010/09/weather-station/)
|
||||
* [Weather Station Software Update](/technical/2010/09/weather-station-software/)
|
||||
|
||||
Old Apps
|
||||
--------
|
||||
|
||||
* [SymbolMate][symbolmate] -- Quickly find and copy symbols and Emoji
|
||||
|
||||
[symbolmate]: https://binarytrance.com/apps/symbolmate
|
|
@ -1,3 +1,4 @@
|
|||
User-Agent: *
|
||||
Disallow:
|
||||
Sitemap: <%= @config[:base_url] %>/sitemap.xml
|
||||
Sitemap: <%= @config[:base_url] %>/v2/sitemap.xml
|
|
@ -1,5 +1,6 @@
|
|||
$ans-serif: Carlito, Calibri, sans-serif
|
||||
$header-colour: #242424
|
||||
$link-color: #36454F
|
||||
|
||||
body
|
||||
font-family: $ans-serif
|
||||
|
@ -77,7 +78,7 @@ a
|
|||
text-decoration: underline
|
||||
|
||||
&:link, &:visited
|
||||
color: #36454F
|
||||
color: $link-color
|
||||
|
||||
h1 a
|
||||
text-decoration: none
|
||||
|
@ -127,6 +128,10 @@ img.cover-photo
|
|||
display: block
|
||||
margin: 0 auto
|
||||
|
||||
img.lobsters
|
||||
position: relative
|
||||
top: 2px
|
||||
|
||||
video
|
||||
max-width: 100%
|
||||
|
||||
|
@ -181,6 +186,9 @@ footer
|
|||
.align-top
|
||||
vertical-align: top
|
||||
|
||||
.with-border
|
||||
border: 1px solid #D8D8D8
|
||||
|
||||
.no-border
|
||||
border: none
|
||||
text-decoration: none
|
||||
|
@ -195,6 +203,34 @@ footer
|
|||
.social-icon-wide
|
||||
margin: 0 0.6em
|
||||
|
||||
.action-button
|
||||
background-color: $link-color
|
||||
border-radius: 0.25em
|
||||
border: 2px solid $link-color
|
||||
color: white
|
||||
display: inline-block
|
||||
font-size: 12px
|
||||
font-weight: bold
|
||||
margin: 0.75em 0
|
||||
padding: 0.5em 1em
|
||||
text-decoration: none
|
||||
text-transform: uppercase
|
||||
|
||||
.action-button-ghost
|
||||
background-color: initial
|
||||
color: $link-color
|
||||
|
||||
.action-button-ghost:hover
|
||||
background-color: $link-color
|
||||
color: white
|
||||
|
||||
.archive-banner
|
||||
padding: 0.5em 0.5em
|
||||
background-color: #fffff1
|
||||
font-weight: 400
|
||||
border-bottom: 1px solid #eae4b9
|
||||
font-size: smaller
|
||||
|
||||
.home
|
||||
h1 > a:first-child
|
||||
-webkit-transition: border-bottom-color 500ms ease-out
|
||||
|
@ -212,6 +248,10 @@ footer
|
|||
max-width: 1200px
|
||||
min-height: 85vh
|
||||
|
||||
.cli-tools
|
||||
h3
|
||||
margin-top: 4em
|
||||
|
||||
#posts
|
||||
width: 100%
|
||||
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue