お気に入りのDeno(ディーノ)、WebSocketを使ったチャットづくりなど、いい感じですが、Nodeで作った既存プロジェクトとの並行はしばらく続きます。 そこで、DenoとNodeに両対応する方法を整理するのを兼ねて、世界で2番目に古いというプログラミング言語、LISPのS式っぽいものを作ってみました。

const n = S.eval([ S.PLUS, 1, [ S.MUL, 2, 3 ] ])

LISPの特徴はツリー構造(LISPでは、S式という)をそのままプログラムとして使うところ。上記、JavaScriptの配列で表現したS式を評価をするサンプルです。


minimum S, src on GitHub
プログラムはとってもシンプル。四則演算とIF文しかありません。興味があれば,forkして、いろいろ機能を追加するなどして遊んでみてください。 (import.metaとglobalThis.processを使い、Deno/Nodeでの直接起動時に説明表示)

ブラウザ上や、Denoでは、import文を使って、簡単に組み込めます(Nodeの場合ダウンロードしてファイルとして使用)

import S from 'https://taisukef.github.io/minimum_S/S.mjs' console.log('S.eval([S.PLUS, 1, 2]) is ' + S.eval([S.PLUS, 1, 2]))

deno test で簡単テストな S_test.ts が走ります。TypeScriptが基本のDenoはテストコードの拡張子はtsとします。 TypeScriptはJavaScriptの上位互換のプログラミング言語なので、拡張子を変えるだけでOKです。

Denoに刺激されてか、Node.jsも試験的実装ながら関数外でも await が使えるように!

const sleep = msec => new Promise(resolve => setTimeout(resolve, msec)) await sleep(3000)

指定された数分ミリ秒待つ関数 sleep を定義して、3000 = 3秒待つ。Nodeで普通に動かそうとすると「SyntaxError: Unexpected reserved word」とエラーになりますが、Node v14.3.0 で下記のように指定すれば、deno同様、動きます。 ただし、deno/node共に対話型アプリ上や、ブラウザ上では引き続き使えないので注意!(src on GitHub)

node --experimental-top-level-await sleep_test.mjs

Denoでの場合

deno run test.mjs

JavaScriptなど、最近のプログラミング言語には便利表記方法がいろいろ増えているので、少しずつ使える幅を増やすと楽できます。 例えば、=> は、関数定義のちょっと変わった書き方、reduceは配列の中身全部に対して処理して一つの値をだすものです。

sleepは、下記のようにも書けます。お好みでどうぞ!(thisを使う時は => と function で挙動が違うので注意)

async function sleep (msec) { return new Promise(function (resolve, reject) { setTimeout(resolve, msec) }) }

Deno情報を調べると気になる、汁なし担々麺「DENO」(こちらの読みは、での)

ファミマで販売中とのことで、こちらも試食!もっちりした麺が良い感じでした!札幌発、行くことがあればぜひ実店舗も巡礼したいところ。(東京、新潟、福島にもあった!)

links
- DenoとWebScoketで作る匿名チャットサーバー&webアプリ

JavaScriptでサーバーサイドもサクサク書けて便利な Node.js。 jsからmjsへ移行したもののブラウザ上のコードとの互換性が無いことにと、プロジェクトごとに増える node_modules が気になっていたところ、Node.jsの作者 Ryan Dahl 氏自身による Deno を発見。 いい感じだったので「PUSHかんたんオープンデータ」を移行してみました。


福井県施設 オープンデータ - PUSHかんたんオープンデータ」(src on GitHub)
バックエンドのエンジン変更なので、見た目は変わりません。 それでは寂しいので、複数の施設をひとまとめにする「集約オープンデータ」に対応! 複数の施設や店舗をひとまとめにしたオープンデータリンクを自由に作成できます。追加、削除、順番変更も思いのまま!


福井県、県有施設等の混雑状況をオープンデータとして公開:民間有志が同データを利用して混雑状況の一覧をスマートフォン等からも閲覧可能なダッシュボードを作成し公開 | カレントアウェアネス・ポータル
国立国会図書館さん、中日新聞さんにご紹介いただきました!オープンデータで切り拓く、ライトな官民連携の仕組み。ぜひ他の地域でもどうぞ!
県有施設の混雑状況をオープンデータに 出発前に確認、スマホでOK:福井:中日新聞(CHUNICHI Web)


Deno
恐竜アイコンがかわいい、Deno(ディーノ)は、Node.js作者が反省を踏まえて開発した、webフレンドリーなもうひとつのJavaScriptバックエンドエンジンです。ブラウザとの互換性の高さと、package.json不要で、URLでimportし、適宜キャッシュしてくれるパッケージ管理システムが特徴です。 (Denoの登場でNode.jsの時代は終わるのか? - Qiita

Node.js 用プログラムからの移行、ファイルアクセスの標準モジュール fs を必要なものだけ独自に用意。(node_fs.mjs on GitHub)

const fs = {} fs.readFileSync = function (fn) { const data = Deno.readFileSync(fn) const decoder = new TextDecoder('utf-8') const s = decoder.decode(data) return s } fs.writeFileSync = function (fn, s) { const d = new TextEncoder('utf-8').encode(s) Deno.writeFileSync(fn, d) } fs.appendFileSync = function (fn, s) { const d = new TextEncoder('utf-8').encode(s) Deno.writeFileSync(fn, d, { append: true }) } fs.readdirSync = function (dirn) { return Deno.readDirSync(dirn) } fs.mkdirSync = function (dirn) { return Deno.mkdirSync(dirn) } export default fs

あとは、expressからDenoのhttpに移植して、完了!(push_deno.mjs on GitHub)

セットアップに npm install はもういりません!下記の起動コマンドで即実行!(ファイルアクセスやネットワークアクセスを許可する -A オプションが必要です)

deno run -A push_deno.mjs

mjs x Deno の組み合わせで作ってみることにします!

Tweet
クリエイティブ・コモンズ・ライセンス
この作品は「Creative Commons — CC BY 4.0」の下に提供されています。
CC BY / @taisukef / アイコン画像 / プロフィール画像 / RSS