大数跨境

去电影院是一个数据可视化问题

去电影院是一个数据可视化问题 索引目录
2024-12-16
0

你喜欢去电影院吗?我喜欢。但我也想知道我要去哪里以及要看哪部电影。但你该如何选择呢?

你无法访问电影院的网站。电影院的网站实在是太多了。当然,你可能有自己喜欢的电影,并且总是去那里看,但你不知道自己错过了什么。

然后,还有聚合器。这个想法很好:把电影院正在放映的所有电影都集中到一个地方。航班聚合器,但针对电影。

不幸的是,实施效果并不好。与任何其他网站一样,聚合器的目标是让您浏览尽可能多的网页,进行尽可能多的点击,并向您展示尽可能多的广告。

他们甚至播放电视广告来代替电影预告片!

信息架构也可能很奇怪:

我应该选择“电影”还是“电影节目”?我应该选择“当前正在上映的电影”还是“新上映的电影”?

因此我决定自己动手,建立一个我一直梦想的电影院选择网站。

了解allekinos.de :

那么它是什么?

该网站播放全德国所有电影院放映的所有电影。

当我说每次放映时,我的意思是:

每场放映、每家电影院、每部电影。全部包含在一个长长的 HTML 表中。

它还能做什么?

只需过滤。您可以过滤:

  • 按城市,

  • 按城市区域(不想走太远),

  • 某家电影院(也许你有最喜欢的一家),

  • 按类型(想和孩子一起看但不知道是什么),

  • 或通过电影(它仍在哪些城市播放?)。

就是这样。这就是网站。

哦,我们还有首映名单,这样你就知道接下来会有什么了。但就是这样。

界面怎么样?

没有。我的意思是,当然有,但我试图让它尽可能隐形。没有徽标。没有菜单。没有页脚。没有分页。没有“查看更多”。没有 cookie 横幅(因为没有 cookie)。没有 ChatGPT/SEO 生成的废话。当然没有广告。

为什么?因为人们不关心那些东西。他们关心的是功能。而我们的 UI 是纯功能。

但是我该如何搜索呢?

当然是 Ctrl+F。我们太谦虚、太懒、也太聪明了,不会试图与浏览器内实现竞争。

等一下,页面大小怎么样?

完全没问题。我的意思是,例如,对于柏林,我们提供 1.4 MB 的 HTML。加上海报则为 3 MB。没问题。

Slack 加载 50 MB(是的,MEGA 字节)来显示 10 条聊天记录列表。AirBnB 加载 15 MB,包括 500 KB HTML,只是为了显示 20 张图片。LinkedIn 加载 1.5 MB 的 HTML(总共 37 MB),这只是我们要显示的数据的一小部分。所以我们没问题。

实际上,这有点令人耳目一新。一张包含一千行的表格能有什么样的速度。感觉很多,但仍然感觉比现代网络上的任何东西都快。

那么移动端呢?

这是个好问题。我还在思考这个问题。

表格技巧在移动设备上不起作用。因此布局需要有所不同,但我还希望它具有与桌面相同的信息密度,这很棘手。

如果你只是让表格垂直,那么即使手指最有力的人也难以滚动。也许有一天我会想出办法。

引擎盖下有什么?

數據識別碼

当我查看数据时,我意识到它是多维的:有电影,有类型、年份、国家、语言,有电影院,有位于各个地区、位于各个城市,还有放映场次,有日期和时间,而且很可能稍后还会出现其他内容。

现在,我不知道如何访问这些数据。电影院是电影的一部分,还是电影是电影院的一部分?所以我决定把它们全部扁平化,然后放入数据库中。

并且成功了!效果非常好。现在我可以利用 DataScript 查询作为数据来动态构建它们:

(defn search [{:keys [city cinema district movie genre]}]
(let [inputs
(cond-> [['$ db]]
city (conj ['?city city])
cinema (conj ['?cinema cinema])
district (conj ['?district district])
movie (conj ['?movie movie])
genre (conj ['?genre genre]))

where
(cond-> [:where]
city (conj '(or
[?cinema :cinema/city ?city]
[?cinema :cinema/area ?city]))
cinema (conj '[?cinema :cinema/title ?cinema-title])
district (conj '[?cinema :cinema/district ?district])
movie (conj '[?movie :movie/title ?movie-title])
genre (conj '[?movie :movie/genre ?genre]))]

(apply ds/q
(concat
'[:find ?show ?date ?time ?url ?cinema ?version ?movie
:keys id date time url cinema version movie
:in]
(map first inputs)
where
'[[?show :show/cinema ?cinema]
[?show :show/date ?date]
[?show :show/time ?time]
[?show :show/url ?url]
[?show :show/movie-version ?version]
[?version :movie-version/movie ?movie]])
(map second inputs))))

整个数据库大约 11 MB,基本上没什么。我甚至不关心适当的存储,每次更新时我都会将整个内容序列化为单个 JSON 文件。

主办

我建网站已经有一段时间了。我自己的服务器上现在有两个网站( Grumpy和这个博客)在运行。我已经花了很多时间,我已经把这一切都搞清楚了。我手边有所有的模板。

但对于allekinos.de,我决定尝试一些不同的东西:application.garden

它是小型 Clojure Web 应用程序(仍处于私人测试阶段)的托管,可以为您处理不重要的细节,让您首先专注于您的应用程序。

并且成功了!非常简单:下载一个可作为命令行工具运行的二进制文件,garden.edn使用项目名称创建文件,然后调用garden deploy。就这样!您的应用上线了!

不,说真的。在其他人使用你的应用之前,你往往会忘记有多少烦人的小细节。但是当像 Garden 这样的应用可以消除这些小细节时,你就会记住,并再次感到震惊!如果这就是 Heroku 过去的感觉,我完全支持它。

Garden 的优点在于它可以帮助您快速入门,但它不是玩具。它可以轻松扩展到生产。自定义域、HTTPS、身份验证、cron、日志、持久存储:它们会为您处理所有这些。

更棒的是:他们甚至为生产提供了 nREPL!同样,无需设置,直接garden repl就可以使用!非常适合调试奇怪的性能问题或运行一次性作业。

举个例子:当我实现 premieres 并提交代码时,我仍然需要第一次运行它。我没有制作特殊标志或端点,也没有添加然后立即删除启动代码,而是连接到远程 nREPL 并调用代码中的函数。没有比这更简单的了!

这对我来说不太正常,但我还是喜欢再次构建 Web 应用程序,因为它很简单。将来可能会构建更多。

结论

一开始,我想要一个能解决我问题的简单网站。我想要一个我喜欢使用的网站。

但我不想把它变成产品。我们已经有足够多的产品了。是时候有人站在用户一边了。而我就是用户之一。

当你信任你的用户并向他们展示你所拥有的一切时,神奇的事情就会发生。

例如,我发现一些我完全不知道的稀有电影正在上映。德语版的《黑客帝国》(!),但每周上映一次,而且只在一家电影院上映。或者《火星快车》,他们只在三个城市上映,除了我所在的城市。你是如何找到这类信息的?

在这里,我发现了它。我查看了数据,你开始看到一些原本完全看不见的东西。

无论如何,尽情享受吧。如果这成为一种趋势,我会全力支持。我很乐意在未来看到更多这样的网站。


【声明】内容源于网络
0
0
索引目录
索引目录是一家专注于医疗、技术开发、物联网应用等领域的创新型公司。我们致力于为客户提供高质量的服务和解决方案,推动技术与行业发展。
内容 444
粉丝 0
索引目录 索引目录是一家专注于医疗、技术开发、物联网应用等领域的创新型公司。我们致力于为客户提供高质量的服务和解决方案,推动技术与行业发展。
总阅读12
粉丝0
内容444