Skip to content

Commit 1236bc8

Browse files
committed
Merge branch 'external-link-check'
2 parents 8da3d97 + 0b3756b commit 1236bc8

27 files changed

Lines changed: 145 additions & 43 deletions

.github/workflows/link-check.yml

Lines changed: 101 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,101 @@
1+
# Monthly external-link check.
2+
#
3+
# The per-push CI (jekyll.yml) checks internal links only via
4+
# _bin/check_links.rb; this workflow covers external link rot, which is
5+
# too slow and too flaky to gate every push on. It builds the site,
6+
# runs lychee against the rendered HTML (excluding our own domain), and
7+
# opens a new GitHub issue with the report when broken links are found.
8+
#
9+
# 403/429 responses (and LinkedIn's proprietary 999) are accepted as
10+
# "alive": bot-walled sites (DOI resolvers, Medium, news sites) return
11+
# them to any checker, and a 403 can't distinguish a bot-wall from real
12+
# rot anyway. The genuine rot signal is 404/410/5xx/timeouts/TLS
13+
# failures. Verified 2026-07 by retesting every 403 with a browser
14+
# user-agent: all resolved to live publisher pages before refusing the
15+
# bot. The .lycheecache means a URL verified good is not re-checked for
16+
# 30 days, so transient failures do not repeat month to month.
17+
#
18+
# at:// URIs (standard.site link tags) cause lychee parse errors
19+
# because the scheme is not HTTP. Lychee has no way to suppress
20+
# pre-parse failures, so the report is filtered after the run.
21+
name: External Link Check
22+
23+
on:
24+
schedule:
25+
# 08:14 UTC on the 3rd of each month. Odd minute to avoid the
26+
# top-of-hour scheduled-workflow congestion on GitHub's runners.
27+
- cron: "14 8 3 * *"
28+
workflow_dispatch:
29+
30+
permissions:
31+
contents: read
32+
issues: write
33+
34+
jobs:
35+
link-check:
36+
runs-on: ubuntu-latest
37+
steps:
38+
- name: Checkout
39+
uses: actions/checkout@v7
40+
41+
- name: Setup Ruby
42+
uses: ruby/setup-ruby@v1
43+
with:
44+
bundler-cache: true
45+
cache-version: 0
46+
47+
- name: Build with Jekyll
48+
run: bundle exec jekyll build
49+
env:
50+
JEKYLL_ENV: production
51+
52+
- name: Restore lychee cache
53+
uses: actions/cache@v4
54+
with:
55+
path: .lycheecache
56+
key: cache-lychee-${{ github.sha }}
57+
restore-keys: cache-lychee-
58+
59+
- name: Check external links
60+
id: lychee
61+
uses: lycheeverse/lychee-action@v2
62+
with:
63+
args: >-
64+
--no-progress
65+
--include-mail
66+
--cache
67+
--max-cache-age 30d
68+
--root-dir "${{ github.workspace }}/_site"
69+
--exclude '^https?://(www\.)?alexgude\.com'
70+
--accept '200..=299, 403, 429, 999'
71+
--max-concurrency 32
72+
--timeout 20
73+
--max-retries 2
74+
'_site/**/*.html'
75+
fail: false
76+
77+
- name: Filter at:// parse errors from report
78+
if: steps.lychee.outputs.exit_code != 0
79+
run: |
80+
grep -v "Cannot parse 'at://" ./lychee/out.md > ./lychee/filtered.md || true
81+
if grep -qE '^\[ERROR\]|^\[TIMEOUT\]|^\[[0-9]{3}\]' ./lychee/filtered.md; then
82+
echo "has_errors=true" >> "$GITHUB_OUTPUT"
83+
fi
84+
mv ./lychee/filtered.md ./lychee/out.md
85+
id: filter
86+
87+
- name: Get report month
88+
if: steps.filter.outputs.has_errors == 'true'
89+
id: date
90+
run: echo "month=$(date -u +%Y-%m)" >> "$GITHUB_OUTPUT"
91+
92+
- name: Open issue with report
93+
if: steps.filter.outputs.has_errors == 'true'
94+
uses: peter-evans/create-issue-from-file@v5
95+
with:
96+
title: "Broken external links — ${{ steps.date.outputs.month }}"
97+
content-filepath: ./lychee/out.md
98+
99+
- name: Fail run if links are broken
100+
if: steps.filter.outputs.has_errors == 'true'
101+
run: exit 1

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ _site
2626

2727
# CI-generated data files
2828
_data/standard_site.json
29+
.lycheecache
2930

3031
# Make stamp files
3132
.prettier-image.stamp

_posts/2016-02-08-lab41_recommender_systems_datasets.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ discovery problems in a number of large organizations. [Anna's post][anna]
2424
gives a great overview of recommenders which you should check out if you
2525
haven't already.
2626

27-
[anna]: https://gab41.lab41.org/recommending-recommendation-systems-cc39ace3f5c1#.li0lnmqi8
27+
[anna]: https://medium.com/gab41/recommending-recommendation-systems-cc39ace3f5c1
2828

2929
The ideal way to tackle this problem would be to go to each organization, find
3030
the data they have, and use it to build a recommender system. But this isn't
@@ -115,7 +115,7 @@ histogram:
115115

116116
The dataset is [available here][jester].
117117

118-
[jester]: http://eigentaste.berkeley.edu/dataset/
118+
[jester]: https://goldberg.berkeley.edu/jester-data/
119119

120120
### Book-Crossings
121121

@@ -130,7 +130,7 @@ dense dataset that has explicit ratings.
130130
The dataset is [available here][bc_data].
131131

132132
[bc]: http://www.bookcrossing.com/
133-
[bc_data]: http://www2.informatik.uni-freiburg.de/~cziegler/BX/
133+
[bc_data]: https://grouplens.org/datasets/book-crossing/
134134

135135
### Last.fm
136136

_posts/2016-03-09-lab41_python2vec.md

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ simple collaborative filtering algorithms. However, if we learned more about
2424
the properties of the various items, we could use more sophisticated
2525
algorithms.
2626

27-
[anna]: https://gab41.lab41.org/recommending-recommendation-systems-cc39ace3f5c1#.li0lnmqi8
27+
[anna]: https://medium.com/gab41/recommending-recommendation-systems-cc39ace3f5c1
2828

2929
For some items---for example, movies---it is relatively easy to imagine what
3030
sort of properties are relevant in order to make recommendations: genre,
@@ -50,8 +50,8 @@ language datasets. In this post, I will give a brief overview of how Word2Vec
5050
works; for a more complete summary see [Karl's post on Anything2Vec][a2v] and
5151
[this paper by Goldberg and Levy][paper].
5252

53-
[chinese]: https://gab41.lab41.org/can-word-vectors-help-predict-whether-your-chinese-tweet-gets-censored-711e7682d12f#.jckj1z8q1
54-
[a2v]: https://gab41.lab41.org/anything2vec-e99ec0dc186#.cdtxo834y
53+
[chinese]: https://medium.com/gab41/can-word-vectors-help-predict-whether-your-chinese-tweet-gets-censored-711e7682d12f
54+
[a2v]: https://medium.com/gab41/anything2vec-e99ec0dc186
5555
[paper]: https://arxiv.org/abs/1402.3722
5656

5757
Word2Vec embeds words into an n-dimensional vector space such that words that
@@ -256,8 +256,8 @@ corpus at least 25 times, so we only cover the most common functions, methods,
256256
and libraries. The user coverage decreases, but not as significantly---most
257257
users, it seems, use at least a few of the most common functions.
258258

259-
[tps]: https://gab41.lab41.org/tps-report-for-recommender-systems-yeah-that-would-be-great-3beb26ab9fe0#.o2frg2eat
260-
[metrics]: https://gab41.lab41.org/recommender-systems-its-not-all-about-the-accuracy-562c7dceeaff#.n291twu23
259+
[tps]: https://medium.com/gab41/tps-report-for-recommender-systems-yeah-that-would-be-great-3beb26ab9fe0
260+
[metrics]: https://medium.com/gab41/recommender-systems-its-not-all-about-the-accuracy-562c7dceeaff
261261
[mllib_collab]: https://spark.apache.org/docs/latest/mllib-collaborative-filtering.html
262262

263263
The low item coverage is a particularly challenging issue. We set the

_posts/2016-07-11-SAT2Vec.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ And ([as shown by][pats_post] my friend and colleague Patrick Callier):
5151

5252
Workin − Working + Going = Goin
5353

54-
[pats_post]: https://gab41.lab41.org/street-style-guide-vector-transformations-betta-work-2ad8d9829587
54+
[pats_post]: https://medium.com/gab41/street-style-guide-vector-transformations-betta-work-2ad8d9829587
5555

5656
## Word2Vec is to the SAT as?
5757

_posts/2016-07-11-lab41_stochastic_depth.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -116,8 +116,8 @@ second lowest for SVHN. They also test using a very deep network (1202 layers)
116116
on CIFAR-10 and find that it produces an even better result, the first time a
117117
1000+ layer network has been shown to further reduce the error on CIFAR-10.
118118

119-
[cifar10]: https://www.cs.toronto.edu/~kriz/learning-features-2009-TR.pdf
120-
[cifar100]: https://www.cs.toronto.edu/~kriz/learning-features-2009-TR.pdf
119+
[cifar10]: https://cave.cs.toronto.edu/kriz/learning-features-2009-TR.pdf
120+
[cifar100]: https://cave.cs.toronto.edu/kriz/learning-features-2009-TR.pdf
121121
[svhn]: http://ufldl.stanford.edu/housenumbers/nips2011_housenumbers.pdf
122122

123123
The main idea behind stochastic depth is relatively simple, remove some layers
@@ -128,7 +128,7 @@ improving network training like [batch normalization][bn][^ioffe]. All in all,
128128
stochastic depth is an essentially free improvement when training a deep
129129
network. I look forward to giving it a shot in my next model!
130130

131-
[bn]: https://gab41.lab41.org/batch-normalization-what-the-hey-d480039a9e3b
131+
[bn]: https://medium.com/gab41/batch-normalization-what-the-hey-d480039a9e3b
132132

133133
[^ioffe]:
134134
{% citation

_posts/2016-09-08-lab41_resnet.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ compare 20- and 56-layer networks and find the 56-layer network performs far
6161
worse; see the image below from their paper.
6262

6363
[bn_paper]: https://arxiv.org/abs/1502.03167
64-
[bn_post]: https://gab41.lab41.org/batch-normalization-what-the-hey-d480039a9e3b
64+
[bn_post]: https://medium.com/gab41/batch-normalization-what-the-hey-d480039a9e3b
6565

6666
[^ioffe]:
6767
{% citation

_posts/2016-09-22-whereto_photo.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ program focus on building a data product using publicly available data. The
2424
project I built, **Whereto.photo**, tried to answer the question: _Where is
2525
the best place in this city to take a picture?_
2626

27-
[insight]: https://www.insightdatascience.com/
27+
[insight]: https://web.archive.org/web/20200129121516/https://www.insightdatascience.com/
2828

2929
[should_i_go_insight]: {% post_url 2018-08-21-should_i_go_to_insight %}
3030

_posts/2016-10-31-lab41_skipthought_vectors.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ sentences.
2626

2727
[rn]: {% post_url 2016-09-08-lab41_resnet %}
2828
[arxiv]: https://arxiv.org/abs/1506.06726
29-
[kiros]: http://www.cs.toronto.edu/~rkiros/
29+
[kiros]: https://scholar.google.com/citations?user=W8zwlYQAAAAJ&hl=en
3030
[w2v]: {% post_url 2016-03-09-lab41_python2vec %}#word-embeddings
3131

3232
[^kiros]:
@@ -165,4 +165,4 @@ detection, but incredibly slow. Running skip-thought vectors on a corpus of
165165
about 20,000 documents took many hours, whereas simpler (and as effective)
166166
methods took seconds or minutes.
167167

168-
[pythia]: https://gab41.lab41.org/tell-me-something-i-dont-know-detecting-novelty-and-redundancy-with-natural-language-processing-818124e4013c#.6xf8nejr9
168+
[pythia]: https://medium.com/gab41/tell-me-something-i-dont-know-detecting-novelty-and-redundancy-with-natural-language-processing-818124e4013c

_posts/2016-11-01-switrs_to_sqlite.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ traffic collision that has been reported in the state---the time of the crash,
2323
the location, the vehicles involved, and the reason for the crash. Even
2424
better, it is [publicly available][data]!
2525

26-
[switrs]: http://iswitrs.chp.ca.gov/Reports/jsp/userLogin.jsp
26+
[switrs]: https://www.chp.ca.gov/programs-services/services-information/switrs-statewide-integrated-traffic-records-system/
2727
[data]: https://github.com/agude/SWITRS-to-SQLite/blob/master/requesting_data.md
2828

2929
Unfortunately, the data is delivered as a set of large [CSV files][csv].

0 commit comments

Comments
 (0)