JIGZEG.INFO
类目(8)
    标签(13)

      在Termux中安装Deno

      发布


      Termux 是一款运行在安卓设备平台上的终端命令行模拟器,无需Root权限就能直接安装和运行Linux环境下的一些程序 [1]

      我们可以给家里旧安卓手机安装上Termux,再通过Termux的终端命令行工具装上openssl等工具就可以拥有一台小型的本地远程Linux终端了(当然,如安卓设备未获取Root权限,某些操作也会受限)。使用Termux,可以在安卓机上跑一些小型服务,让吃灰的旧手机也能发光发热。下面介绍在Termux终端命令行下安装Deno的几种方式。

      方式一:使用proot-distro

      proot-distro 是Termux下的各种Linux发行版的安装和管理工具,有了它就可以在不需要root权限的情况下运行诸如Ubuntu、Debian、Fedora等Linux发行版了,下面以安装Ubuntu为例进行介绍。

      安装proot-distro

      # 安装proot-distro
      pkg install proot-distro
      # 查看可用的Linux发行版
      proot-distro list
      # 安装Ubuntu(这里会从github下载一些资源,如下载缓慢建议开启代理)
      proot-distro i ubuntu
      # 等待下载完毕,启动Ubuntu
      proot-distro login ubuntu

      进入Ubuntu的Shell环境,之后,就可以像在普通Linux环境下安装Deno了。

      安装Deno

      安装解压缩工具:

      apt update
      # 安装zip和unzip
      apt install unzip zip

      可以选择安装Deno的最新版本:

      # opt1. 安装Deno的最新版本
      curl -fsSL https://deno.land/install.sh | sh

      或者指定版本安装:

      # opt2. 指定安装版本,例如:v1.45.2
      curl -fsSL https://deno.land/x/install/install.sh | sh -s v1.45.2

      在出现对话语句:Edit shell configs to add deno to the PATH? (Y/n) 时输入Y回车,设置PATH环境变量。

      在出现对话语句:Set up completions? 时,可以直接按下回车。

      之后终端运行:

      # 刷新环境变量
      source ~/.bashrc
      # 查看Deno安装状态
      deno --version

      方式二:直接下载termux-deno二进制可执行文件

      相关说明见此仓库:https://github.com/cions/termux-deno 的 README.md。

      • 在Termux终端环境下,安装Deno的最新版本:
      # opt1. 下载安装Termux-Deno的二进制可执行文件
      curl -fsSL -o ~/.deno/bin/deno https://api.cirrus-ci.com/v1/artifact/github/cions/termux-deno/deno/deno-aarch64-android/deno && chmod +x ~/.deno/bin/deno

      然后在右侧编译任务列表中点击选择某个Deno的编译版本;

      之后,在任务列表下,点击选择 Build Deno

      在之后的跳转页面,在 Artifacts 一栏、打开 deno-aarch64-android 文件夹,下载此版本的Termux-Deno二进制编译文件:

      将下载的文件复制到 ~/.deno/bin/ 目录下,为其添加可执行权限,再将 ~/.deno/bin 追加到PATH环境变量,即可。

      如上的操作,可以简化为一行命令:

      # opt2. 安装指定版本的Termux-Deno,例如:v1.46.2
      ## v1.46.2
      curl -fsSL -o ~/.deno/bin/deno https://api.cirrus-ci.com/v1/artifact/task/6156973433946112/deno-aarch64-android/deno && chmod +x ~/.deno/bin/deno

      最后

      # 卸载Deno
      rm -rf ~/.deno

      1. The Termux Wiki: Introduction ↩︎


      此文被收纳在#Deno#类目下,被贴上了#Termux#标签

      简单使用deno实现反向地理编码

      发布


      反向地理编码(Reverse Geocoding)是将经纬度等坐标信息转换为人类可读的地址(如城市名、街道名等)的过程。实现反向地理编码有多种办法,可以调用百度、高德、谷歌等服务商提供的第三方API,也可自行去解析地图离线数据实现。如果需求不是要得到精确地址(例如只要得到省、市名),那么采用后者无疑是最优的。

      下载省、市边界数据

      点击打开:https://datav.aliyun.com/portal/school/atlas/area_selector,在页面右侧,就可以下载省或市的边界数据了:

      或者终端里边运行:

      # 市级粒度数据
      wget -O china_full_city.geo.json https://geo.datav.aliyun.com/areas_v3/bound/100000_full_city.json

      最后下载来的 china_full_city.geo.json 数据结构大概长这样:

      interface FeatureCollection {
          features: {
              // 各个市级行政区域的轮廓数据
              geometry: {
                  coordinates: [float, float][][];
                  type: 'MultiPolygon';
              };
              properties: {
                  name: string;
                  parent: {
                      areacode: int;
                  };
                  // …此处省略其他的一些属性
              };
              type: 'Feature';
          }[];
          type: 'FeatureCollection';
      }

      它是遵循 GeoJSON 的。所谓“GeoJSON”,就是一种用于编码地理数据的开源格式,专门用于描述几何对象(点、线、多边形等)这类数据的一种格式规范,被广泛应用于地理信息系统(GIS)、地图服务和Web应用。

      有了全国所有市的轮廓数据,我们就知道全国每个市在地图上的板块范围。这样,通过遍历每个市的多边形区域,使用turf.js中几何的算法,判断待查询的GPS坐标是否在多边形的范围内,即可得出所在城市。

      使用 Turf.js 来检索GeoJSON文件

      china_full_city.geo.json 同级目录下新建 getCityName.ts 文件,编写TypeScript代码:

      import { FeatureCollection, Feature, MultiPolygon } from 'https://esm.sh/v135/@types/geojson@7946.0.14/index.d.ts';
      
      // # 首先是根据这个json文件的结构,可以写出它的类型`XFeatureCollection`:
      
      // properties的属性
      type XGeoJsonProperties = {
          acroutes: number[],
          adcode: number,
          center: number[],
          centroid: number[],
          childrenNum: 0,
          level: string,
          name: string, // 市级行政区名称
          parent: {adcode: number}, // 市级行政区所在的省级行政区编码
          subFeatureIndex: number,
      }
      
      type XFeatureCollection = FeatureCollection<MultiPolygon, XGeoJsonProperties>;
      
      // # 然后遍历features列表的各个城市,使用turf.js封装的`booleanPointInPolygon`方法,
      //   判断待查询经纬度的点是不是在市级行政区图块多边形之中,是:则表示坐标在该市范围之内
      
      import chinaProvincesGeoJSON from "./china_full_city.geo.json" with {type: 'json'};
      import { booleanPointInPolygon } from "https://esm.sh/@turf/boolean-point-in-polygon@7.1.0";
      import * as turf from "https://esm.sh/@turf/turf@7.1.0";
      
      // 定义一个待查询的国内经纬度坐标,形式是“度分秒”
      const [[d0, m0, s0], [d1, m1, s1]] = [[112, 34, 56], [34, 56, 12]];
      // 转化为“度”的坐标形式
      const [lng, lat] = [d0+m0/60+s0/3600, d1+m1/60+s1/3600];
      // 定义为Point坐标类型
      const pt = turf.point([lng, lat]);
      
      // 定义类型
      const collections = chinaProvincesGeoJSON as XFeatureCollection;
      
      let targetFeature!: Feature<MultiPolygon, XGeoJsonProperties>;
      
      for (const f of collections.features) {
          // 使用turf的这个函数判断这个点是不是在(市级行政区)多边形区域内
          const ret = booleanPointInPolygon(pt, turf.multiPolygon(f.geometry.coordinates));
          if (ret) {
              targetFeature = f;
              break;
          }
      }
      
      console.log(targetFeature ? targetFeature.properties.name : '(超出查询范围)');

      然后终端运行:

      # 返回:焦作市
      deno run -A getCityName.ts

      如果想要知道城市所在的省级行政区名,可以通过查询父级行政区域码 targetFeature.properties.parent.adcode 得知:

      const provinceAdcodeNameMapping: {[k: number|string]: string} = {
          "110000":"北京市","120000":"天津市","130000":"河北省","140000":"山西省","150000":"内蒙古自治区",
          "210000":"辽宁省","220000":"吉林省","230000":"黑龙江省",
          "310000":"上海市","320000":"江苏省","330000":"浙江省","340000":"安徽省","350000":"福建省","360000":"江西省","370000":"山东省",
          "410000":"河南省","420000":"湖北省","430000":"湖南省","440000":"广东省","450000":"广西壮族自治区","460000":"海南省",
          "500000":"重庆市","510000":"四川省","520000":"贵州省","530000":"云南省","540000":"西藏自治区",
          "610000":"陕西省","620000":"甘肃省","630000":"青海省","640000":"宁夏回族自治区","650000":"新疆维吾尔自治区",
          "710000":"台湾省",
          "810000":"香港特别行政区","820000":"澳门特别行政区",
          "100000_JD":""
      };
      
      // 返回:河南省
      console.log(targetFeature ? provinceAdcodeNameMapping[targetFeature.properties.parent.adcode] : '');

      最后

      这种办法适合对解析精度要求不太高的场景,如果想要解析到区和街道或者更高级别,考虑到未来数据更新和维护的复杂度,建议还是使用各大第三方平台的API比较好。


      此文被收纳在#Deno#类目下,被贴上了#反向地理编码#标签

      发布


      前言

      到目前,此博客已完成重构,大部分页面和功能开发接近尾声。

      博客最终采用的开发框架是 Deno Fresh。Fresh是一个基于 Deno 的全栈Web框架,旨在帮助开发者快速构建现代、轻量级、高性能的 Web 应用程序,对于一个博客系统应当是绰绰有余。总的一个多月开发下来,配合VSCode,前后端开发体验感觉异常畅快~

      内容 & 设计

      博客内容方面,此次重构还是沿用了之前的板块结构:

      1. 首页 - 左侧加入了一些时钟、画廊等小组件,让整个首页不太单调,后续还会扩展这个位置,新写一些有趣的小组件;发布的画廊也会展示了
      2. 分类 - 能按照发文的类目和标签筛选查看
      3. 归档 - 整个博客文章的目录,可以按照年份/时间正倒序查看
      4. 搜索 - 没有太大变化,可按照默认/最新顺序搜索,高亮展示匹配到的关键字
      5. 画廊 - 新加入了照片拍摄参数等信息展示
      6. 关于 - 没有太大变化

      博客UI设计方面,网站走的是简约/几何风,可以自定义主题色调,支持全局切换深色模式。

      最后

      恰好,就在昨天(10月10日),Deno发布了2.0版本[1]。新版本除了带来了很多方面的特性外,官方的logo和官网UI焕新了。在官网,可以自定义自己的“Dino”:

      未来,会抽空将博客Deno版本迁移至2.x,可能需要等待依赖的某些插件做好Deno 2的兼容才行。


      1. Announcing Deno 2 ↩︎

      此文未被分类,没有标签
      ← 早期文第 2 页 / 共 2 页近期文 →