以下の abs
というワードを定義したとする。
1
2
3
4
5
6
|
: abs ( n -- |n| )
dup 0<
if
negate
then
;
|
以下のように -7 を渡してみたときのことを考える。
-7
というワードは、-7 という数値をスタックに積む。
Forth はスタック思考言語であり、スタックでものを考える。
スタックが共にあらんことを。
先ほど定義した abs
というワードはスタックの一番上にある数値を絶対値に変更する。
abs
の中身に移っていくわけだが、最初のワードは dup
でこれはスタックの一番上の値をもっかい積む。
先ほど -7 が積まれたので、スタックの中身はもっかい -7 が積まれて多分こうなっているはず:
1
2
3
4
5
|
+--------+
| -7 |
+--------+
| -7 |
--+--------+---
|
次の 0<
というワードはいわゆる 0 <
という 2 つのワードのショートカットだ。
Lisp でも 1+
というものがあって、Forth でもあるがこれはスタックの一番上に 1 を足すというものだ。
で、0<
というワードの動きに移るが、これは -7 0 <
という風に並べられたものに等しい。
Lisp で書けばこうだ:
-7 と 0 とでは 0 の方が大きいため、negate
というワードが来る。
negate
が評価?される前のスタックの中身はこうだ:
1
2
3
|
+--------+
| -7 |
--+--------+---
|
negate
というワードはスタックの一番上の値の符号を反転する。
ここでスタックの一番上は -7 なので、-7 の符号が反転し、7 になる。
そういうわけで、スタックの中身はこうなる:
1
2
3
|
+--------+
| 7 |
--+--------+---
|
ということで、評価が終わった。
インストールする
PowerShell を起動し、以下のように打つ:
1
2
|
Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser
Invoke-RestMethod -Uri https://get.scoop.sh | Invoke-Expression
|
インストールできたら、とりあえずバージョンを表示してみる:
表示できたら多分インストールできたことが確認できたと思われる。
インストールしたあと
pandoc
をインストールしてみると良いんじゃないかなぁ。
バケット
scoop
は bucket
を追加してインストールできるアプリを増やしていけるので、デフォルトで入ってるやつ以外のを使いたいという場合は bucket
を追加してみよう。
extra
を追加するには以下のように打つよ:
1
|
scoop add bucket extras
|
1
2
3
|
for ^5 {
say <ろ ぐ ぼ>.roll(3).join;
}
|
やってみた。
できた。
トップのタイトルが -
になってたりとか、コードブロックの行番号が変だったりといろいろと直すところがありそう。
エラる…。
Error: RangeError [ERR_BUFFER_OUT_OF_BOUNDS]: "length" is outside of buffer bounds
「長さ」はバッファ境界外です
ってどういうことなんだ…?
そして以下がおそらくスタックトレース:
- buffer:1066 Buffer.utf8Write
node:internal/buffer:1066:13
- node.cjs:1151 Packr.encodeUtf8
[siofrey-hill]/[msgpackr]/dist/node.cjs:1151:18
Cloudflare の Pages にデプロイしてみたときのこと。
ビルド時のログである:
2024-12-07T03:50:14.068214Z Executing user command: npx next build
2024-12-07T03:50:14.925762Z You are using Node.js 18.17.1. For Next.js, Node.js version >= v18.18.0 is required.
2024-12-07T03:50:14.940442Z Failed: Error while executing user command. Exited with error code: 1
2024-12-07T03:50:14.948947Z Failed: build command exited with code: 1
2024-12-07T03:50:15.639809Z Failed: error occurred while running build command
さて、ローカルにおける node
のバージョンは以下の通りである:
$ node --version
v23.3.0
つまり、Cloudflare Pages における node
のバージョンは v18.17.1
なのだが、npx next build
を実行するのに必要なバージョンは v18.18.0
以上なのである。
これではコマンドを実行できず、デプロイが失敗する…。
Next.js 以外のフレームワークを使った方が良いようである…。
create-next-app
を更新しろという風な表示が出たので、更新してみた。
$ npm i -g create-next-app
(node:9628) ExperimentalWarning: CommonJS module C:\ProgramData\Scoop\persist\nodejs\bin\node_modules\npm\node_modules\debug\src\node.js is loading ES Module C:\ProgramData\Scoop\persist\nodejs\bin\node_modules\npm\node_modules\supports-color\index.js using require().
Support for loading ES Module in require() is an experimental feature and might change at any time
(Use `node --trace-warnings ...` to show where the warning was created)
added 1 package in 7s
メッセージっぽいところの翻訳はこちら:
en:
Support for loading ES Module in require() is an experimental feature and might change at any time
(Use `node --trace-warnings ...` to show where the warning was created)
ja:
require() での ES モジュールのロードのサポートは実験的な機能であり、いつでも変更される可能性があります
(警告が作成された場所を表示するには、`node --trace-warnings ...` を使用します)
supports-color/index.js
が debug/src/node.js
を require
しているみたいだ。
また、debug/src/node.js
は ES モジュールであり、これの require
でのロードは実験的なサポートだよということを伝える warning らしい。
おそらくあまり問題はなさそうだ。
Dec 5, 2024 by map[name:Ned Rihine]
ハイドレーションって何…?
Console Error
Hydration failed because the server rendered HTML didn't match the client. As a result this tree will be regenerated on the client. This can happen if a SSR-ed Client Component used
- A server/client branch `if (typeof window !== 'undefined')`.
- Variable input such as `Date.now()` or `Math.random()` which changes each time it's called.
- Date formatting in a user's locale which doesn't match the server.
- External changing data without sending a snapshot of it along with the HTML.
- Invalid HTML tag nesting.
It can also happen if the client has a browser extension installed which messes with the HTML before React loaded.
See more info here: https://nextjs.org/docs/messages/react-hydration-error
そのクラスや構造体が実際にやることに沿った名前をつけよう。
to-vfile
は VFile
を扱うモジュールです。
1
|
import { read, write, toVFile } from 'to-vfile';
|
remark
と相性がいいっていうか、同じ作者さんが作ってるみたいなので、remark
の例によく出てきます。
read()
は実のところ、Perl における slurp
のようなものです。
違うのは string
ではなくて VFile
を返すところです。
1
|
const vfile /* : VFile */ = await read( './hoge.md' );
|
.value
でファイルの内容を参照できます。
1
|
console.log( vfile.value ); // => <ファイルの内容>
|
write()
がほんとにわかりませんでしたが、test.js
を見て理解することができました:
1
2
|
const destFilePath = changeExtention( './hoge.md', '.html' );
await write( { path: destFilePath, data: 'Hello, World!' } );
|
NodeJS の fs.writeFile()
風に書くと以下のようになります:
1
2
3
4
5
6
7
8
|
async function writeVFile(filepath, data/*, options */) {
const vfile = {
path: filepath,
data: data
};
await write( vfile );
}
|